Python模块--base64
base64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据,是一种可逆的编码方式。由于某些系统中只能使用ASCII字符,或者有些网络传输不支持二进制编码的字节流的传输,这时我们可以使用base64编码将其转换为ASCII字符或将其装换为字符串。另外,base64可以作为简单的加密工具。
一 原理
众所周知,传统的一个字节占8位,base64是将原先的二进制字节流以n(n可以等于6,5,4等)位为分割,然后在经过base64字符编码对照表,编码为可打印的字符串。base64字符编码对照表如下:
例如:字符串’abc’通过base64 6位分割编码后变为’YWJj’
长度为3个字节的数据位数是8*3=24,可以精确地分成6*4。但如果位数不是6的倍数怎么办?这时需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。
然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。
py3中代码如下:
>>> import base64 >>> base64.b64encode(b'abc') b'YWJj' >>> base64.b64encode(b'ab') b'YWI=' >>> base64.b64encode(b'a') b'YQ=='
除了b64encode,另外还有b32encode,b16encode,这些编码原理都是相同的。
b32encode取的是5位分割,5和8的最小公倍数为40,那么b32的最小单位为40/5=8个字符,缺失以‘=’补齐
b16encode去的是4位分割,4和8的最小公倍数为8,那么b16的最小单位为8/4=2个字符,缺失以‘=’补齐
>>> base64.b32encode(b'abc') b'MFRGG===' >>> base64.b16encode(b'abc') b'616263'
二 常见方法及使用
b64encode(s, altchars=None)/b64decode(s, altchars=None)
其中 s 是要编/解码的字符串;默认参数altchars的可选值必须是长度为两字节的字符串(py2支持至少两字节的字符串,第二个字节后的内容被忽略),该方法表示在编/解码过程中将使用参数altchars中的前两个字符替换标准Base64字符集中的'+'和'/'。至于什么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。
py3版本:
encode_str = base64.b64encode(b'i\xb7\x1d\xfb\xef\xff',b'#-') print(encode_str) # b'abcd##--' print(str(encode_str,'utf8')) # 对字符串解码 decode_str = base64.b64decode(encode_str,'#-') print(decode_str) # b'i\xb7\x1d\xfb\xef\xff'
py2版本:
>>> encode_str = base64.b64encode(b'i\xb7\x1d\xfb\xef\xff',b'#-&*') >>> encode_str 'abcd##--' >>> decode_str = base64.b64decode(encode_str,'#-') >>> decode_str 'i\xb7\x1d\xfb\xef\xff' >>> decode_str = base64.b64decode(encode_str,'#-$*##') >>> decode_str 'i\xb7\x1d\xfb\xef\xff'
encodestring/decodestring
用来编码和解码字符串
base64.standard_b64encode(s)和base64.standard_b64decode(s)等价于base64.b64encode(s)和base64.b64decode(s),不再描述。
urlsafe_b64encode/urlsafe_b64decode
用来专门对url进行base64编解码的,内部实际上也是调用的b64encode和b64decode。
base64.urlsafe_b64encode(s)和base64.urlsafe_b64decode(s)分别等价于base64.b64encode(s , '-_')和base64.b64decode(s , '-_'),即在编/解码过程中使用'-'和'_'替代标准Base64字符集中的'+'和'/',生成可以在URL中使用的Base64格式文本
py3版本:
url = "http://www.cnblogs.com/Joe1991/articles/8695020.html"
# 对url的字符串进行编码
url_encode = base64.urlsafe_b64encode(url.encode("utf-8"))
print(url_encode) # b'aHR0cDovL3d3dy5jbmJsb2dzLmNvbS9Kb2UxOTkxL2FydGljbGVzLzg2OTUwMjAuaHRtbA=='
print(str(url_encode,'utf8')) # aHR0cDovL3d3dy5jbmJsb2dzLmNvbS9Kb2UxOTkxL2FydGljbGVzLzg2OTUwMjAuaHRtbA==
# 对url进行解码
url_decode = base64.urlsafe_b64decode(url_encode)
print(url_decode) # b'http://www.cnblogs.com/Joe1991/articles/8695020.html'
print(str(url_decode,'utf8')) # http://www.cnblogs.com/Joe1991/articles/8695020.html
py2版本:
>>> url = "http://www.cnblogs.com/Joe1991/articles/8695020.html" >>> url_encode = base64.urlsafe_b64encode(url) >>> url_encode 'aHR0cDovL3d3dy5jbmJsb2dzLmNvbS9Kb2UxOTkxL2FydGljbGVzLzg2OTUwMjAuaHRtbA==' >>> type(url_encode) <type 'str'> >>> url_decode = base64.urlsafe_b64decode(url_encode) >>> url_decode 'http://www.cnblogs.com/Joe1991/articles/8695020.html' >>> type(url_decode) <type 'str'>
注意:在python2之前base64模块函数的参数可以直接使用字符串,python3以后只能适用二进制字符串。





浙公网安备 33010602011771号