-- TOC --
Base64编码,就是使用64个特别选出的字符
来表示任意字符串。由于采用6bit编码
,所以正好只需要64个字符。
计算机系统的8bit标准byte长度,通过3个byte=24bit=4个Base64字符
的方式进行转换,转换后size增大33.33%
。
有些网络传送渠道并不支持所有的字节编码,例如传统的Email邮件服务器,只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的解决方法就是在不改变传统协议的情况下,做一种扩展方案来支持任意二进制字节流的传送。把不可打印的字符通过可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。
base64编码,就是全部英文字母的大小写,加上10个数字,再加上+和/两个符号。(26*2+10+2=64)
每3个byte一组,转换成4个6bit的base64编码。
如果要编码的字节流不是3的倍数,最后会剩下1个或2个字节怎么办?
在进行Base64编码之前,先用\x00
字节流在末尾补足,做Base64编码,最后在base64编码的末尾加上1个或2个=
号,表示补了多少\x00字节,解码的时候反过来。
>>> import base64
>>> base64.b64encode(b'abcd')
b'YWJjZA=='
>>> base64.b64decode(b'YWJjZA==')
b'abcd'
abcd要补两个\x00,因此产生的base64编码有两个=号。(看到末尾带=号的字符串,就要想到可能是base64编码过的)
去掉base64编码的=号,如何解码?
由于=号字符也可能出现在Base64编码中,但=号用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉。去掉=号之后,如何解码?
因为Base64是把3个字节变为4个可显示字节,所以,Base64编码的长度永远是4的倍数,因此,只需要加上=号,把Base64字符串的长度变为4的倍数,就可以正常解码了。
由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以出现一种"url safe"的base64编码,其实就是把字符+
和/
分别变成-
和_
。
>> base64.urlsafe_b64decode(b'xy-_')
b'\xc7/\xbf'
>>> base64.urlsafe_b64decode(b'xy+/')
b'\xc7/\xbf'
>>> base64.b64decode(b'xy+/')
b'\xc7/\xbf'
前面的代码示例,展示了base64模块的基本使用,同时此模块也可以在命令行直接使用:
$ echo '12345' | python3 -m base64
MTIzNDUK
$ echo '12345' | python3 -m base64 | python3 -m base64 -d
12345
本文链接:https://cs.pynote.net/sf/202109125/
-- EOF --
-- MORE --