Python模块--base64

base64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据,是一种可逆的编码方式。由于某些系统中只能使用ASCII字符,或者有些网络传输不支持二进制编码的字节流的传输,这时我们可以使用base64编码将其转换为ASCII字符或将其装换为字符串。另外,base64可以作为简单的加密工具。

一 原理

众所周知,传统的一个字节占8位,base64是将原先的二进制字节流以n(n可以等于6,5,4等)位为分割,然后在经过base64字符编码对照表,编码为可打印的字符串。base64字符编码对照表如下:

base64code

例如:字符串’abc’通过base64 6位分割编码后变为’YWJj’

image

长度为3个字节的数据位数是8*3=24,可以精确地分成6*4。但如果位数不是6的倍数怎么办?这时需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。

然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。

image

image

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以后只能适用二进制字符串。

posted @ 2018-07-05 16:41  Joe1991  阅读(240)  评论(0)    收藏  举报