Base64编码

-- TOC --

Base64编码,就是使用64个特别选出的字符来表示任意字符串。由于采用6bit编码,所以正好只需要64个字符。

计算机系统的8bit标准byte长度,通过3个byte=24bit=4个Base64字符的方式进行转换,转换后size增大33.33%

为什么需要Base64编码

有些网络传送渠道并不支持所有的字节编码,例如传统的Email邮件服务器,只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的解决方法就是在不改变传统协议的情况下,做一种扩展方案来支持任意二进制字节流的传送。把不可打印的字符通过可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。

Base64编码表

base64

base64编码,就是全部英文字母的大小写,加上10个数字,再加上+和/两个符号。(26*2+10+2=64)

如何转换成Base64编码

byte2base64

每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的倍数,就可以正常解码了。

url safe的base64编码

由于标准的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'

Python3的base64模块

前面的代码示例,展示了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 --