本文约1620字,建议阅读时间8~10分钟
关键字:python,二进制数据,ASCII字符,编码,base64
base64模块提供了二进制数据与ASCII字符之间编码与解码的方法(也可参见binascii模块),包括Base16、Base32、Base64、Ascii85和Base85方法。上述方法非常适合二进制数据的编码,主要用于安全电子邮件、URL或者HTTP的post请求等,但与uuencode程序不同。
basse64模块提供了两个接口。新接口支持将类字节对象编码为ASCII字节,并且提供将类字节对象或者包含ASCII码的字符串解码为字节;旧的接口不支持将字符串解码,但支持将文件对象编码和解码,且只支持Base64的标准字母表,每76个字符换行。
1、新接口
(1)Base64编码
from base64 import b64encode
data_bin=b'Winter to spring be far behind.’
b64encode(data_bin,altchars=None)
#返回b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg=='
#备选参数altchars指定时必须是长度为2的类字节对象(超过2多余的字节将被忽略),用于替代+和/字符,下同
#注:输入为类字节对象,返回包含ASCII的字节串,如果想获取相应的ASCII字符串,可通过decode()方法获得
(2)Base64解码
from base64 import b64decode
data_ascii=b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg=='
b64decode(data_ascii,altchars=None,validate=False)
#返回b'Winter to spring be far behind.',结果与
b64decode('V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg==',altchars=None,validate=False)一致
#validate为False时,那些既不在base64标准字母表中也不在altchars指定的替换字符中的字符将于填充检查前被丢弃,否则为True时,将抛出binascii.Error
#注:输入必须为包含ASCII的字节或字符串,输出为字节串
(3)标准Base64编码
from base64 import standard_b64encode
standard_b64encode(data_bin)
#返回b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg=='
#注:与b64encode的区别在于,当altchars参数为None时,两者结果一致
(4)标准Base64解码
from base64 import standard_b64decode
standard_b64decode(data_ascii)
#返回b'Winter to spring be far behind.'
#注:与b64decode的区别在于,当altchars参数为None,validate为False时,两者结果一致
(5)基于URL和文件系统安全字母表的Base64编码
from base64 import urlsafe_b64encode
urlsafe_b64encode(data_bin)
#返回b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg=='
#注:与b64encode的区别在于,采用urlsafe方法时字母表将以”-”替换“+”,”_”替换“/”
(6)基于URL和文件系统安全字母表的Base64解码
from base64 import urlsafe_b64decode
urlsafe_b64decode(data_ascii)
#返回b'Winter to spring be far behind.'
#注:与b64decode的区别在于,采用urlsafe方法时字母表将以”-”替换“+”,”_”替换“/”
(7)Base32编码
from base64 import b32encode
b32encode(data_bin)
#返回b'K5UW45DFOIQHI3ZAONYHE2LOM4QGEZJAMZQXEIDCMVUGS3TEFY======'
(8)Base32解码
from base64 import b32decode
data_ascii=b'K5UW45DFOIQHI3ZAONYHE2LOM4QGEZJAMZQXEIDCMVUGS3TEFY======'
b32decode(data_ascii,casefold=False,map01=None)
#返回b'Winter to spring be far behind.'
#备选参数casefold表示是否接受小写字母作为输入,为了安全考虑,默认值为False
#备选参数map01不为None时,数字0将被映射为O,数字1将被映射为指定的字符,为了安全起见,默认为None,即不接受0和1作为输入
(9)Base16编码
from base64 import b16encode
b16encode(data_bin)
#返回b'57696E74657220746F20737072696E672062652066617220626568696E642E'
(10)Base16解码
from base64 import b16decode
data_ascii=b'57696E74657220746F20737072696E672062652066617220626568696E642E'
b16decode(data_ascii)
#返回b'Winter to spring be far behind.'
(11)Ascii85编码
from base64 import a85encode
a85encode(data_bin,foldspaces=False,wrapcol=0,pad=False,adobe=False)
#返回b"=(uPoATAo8D]j+?EbTE(+C\\n)Amo^&@V'4eDIb@"
#备选参数foldspaces为True时表示使用一个特殊的短序列y来代替4个连续的空间(ASCII 0x20),下同
#wrapcol控制输出是否添加换行符
#pad控制输入长度是否在编码前填充为4的倍数
#adobe控制编码后的字节序列是否在首尾添加,下同
(12)Ascii85解码
from base64 import a85decode
data_ascii=b""
a85decode(data_ascii,foldspaces=False,adobe=True,ignorechars=b'\t\n\r\v')
#返回b'Winter to spring be far behind.'
#ignorechars为忽略输入的字节字符串
(13)Base85编码
from base64 import b85encode
b85encode(data_bin)
#返回b'S7~l^WpW^NZy
b85encode(data_bin,pad=True)
#返回b'S7~l^WpW^NZy
#pad为True时,当data_bin的长度不是4的倍数时,填充b’\0’至4的倍数
(14)Base85解码
from base64 import b85decode
data_ascii=b'S7~l^WpW^NZy
b85decode(data_ascii)
#返回b'Winter to spring be far behind.'
2、旧接口
(1)二进制文件的解码
from base64 import decode
decode(input,output)
#input为二进制输入文件对象
#output为二进制数据的写入文件对象
(2)类字节的解码
from base64 import decodebytes
data_ascii=b64encode(data_bin)
decodebytes(data_ascii)
#返回b'Winter to spring be far behind.'
#注:该方法的输入必须为Base64方法的类字节编码
(3)二进制文件的编码
from base64 import encode
encode(input,output)
#input为二进制输入文件对象
#output为Base64方法编码数据的写入文件对象
(4)类字节的编码
from base64 import encodebytes
encodebytes(data_bin)
#返回b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg==\n'
#注:该方法与新接口b64encode的区别在于输出中每76个字节长度后插入换行符b’\n’
(完)
欢迎关注【lambda派】!
相关阅读:
安全随机数字生成:secrets
gz格式压缩文件操作:gzip
路径常规操作os.path
序列化与反序列化:pickle
迭代器函数模块itertools