3、base64

Base64是一种用64个字符(26个大写字母、26个小写字母、0-9、’+‘、’/‘)来表示任意二进制数据的方法。

用记事本打开exejpgpdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法

对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit

base64-encode

这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串

如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉

编码与解码

字符串

import base64

msg = '你好'
# 将字符串转为bytes
msgBytes = msg.encode('utf8')

base64Result = base64.b64encode(msgBytes)
print('编码后的字节码为: %s' % base64Result)
print('编码后的字符串为: %s' % base64Result.decode('utf8'))

bytesResult = base64.b64decode(b'5L2g5aW9')
print('解码后字节码为: %s' % bytesResult)
print('解码后字符串为: %s' % bytesResult.decode('utf8'))


'''
编码后的字节码为: b'5L2g5aW9'
编码后的字符串为: 5L2g5aW9
解码后字节码为: b'\xe4\xbd\xa0\xe5\xa5\xbd'
解码后字符串为: 你好
'''

本地图片

编码

import base64

# 以二进制读的方式打开图片test.jpg
with open('./test.jpg','rb') as file:
    jpgBytes = file.read()
    # 将图片的字节码转为base64字节码
    base64Bytes = base64.b64encode(jpgBytes)
    # 将base64字节码转为字符串,并添加图片前缀 data:image/jpg;base64,
    base64Str = 'data:image/jpg;base64,%s' % base64Bytes.decode('utf8')



# 将base64字符串存入文件1.txt
with open('./1.txt','w') as f:
    f.write(base64Str)

解码

import base64

#读取1.txt中的base64字符串
with open('./1.txt','r') as file:
    base64Str = file.read()
    #获取文件类型
    suf = base64Str[base64Str.find('/') + 1:base64Str.find(';')]
    #截掉base64前缀 data:image/jpg;base64,
    jpgBytes = base64.b64decode(base64Str[base64Str.find(',') + 1:])

#将图片字节码写入二进制文件中
with open('./test1.%s' % suf,'wb') as f:
    f.write(jpgBytes)