9

FooFish-Python之禅

 4 years ago
source link: https://foofish.net/base64.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

base64 是什么?

Base64,顾名思义,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"一共64个字符的字符集,(另加一个“=”,实际是65个字符,至于为什么还会有一个“=",这个后面再说)。任何符号都可以转换成这个字符集中的字符,这个转换过程就叫做base64编码。

base64怎么转换

首先将字符串(图片等)转换成二进制序列,然后按每6个二进制位为一组,分成若干组,如果不足6位,则低位补0。每6位组成一个新的字节,高位补00,构成一个新的二进制序列,最后根据base64索引表中的值找到对应的字符。

timg.jpg

我们举个例子, 假设有字符串“abc", 我们要对其进行base64编码,最后结果会是什么呢?

微信截图_20201220153059.png

字符串abc对应3个字节,一共24位,按6位为一组可分为4组,在每组的高位补上00,经过转换,abc 的 base64 编码是 YWJj, 由原来的3个字母变成了4个,所以base64会比原字符串更长。

那问题来了,假设原始字符串不够3个字节,只有一个字节或者两个字节怎么办?

以两个字节为例, 按照上面的转换逻辑,经过编码转换,第三个字节只有4位,需要在第三组前后都要加两个0,转换后的字符串是 YWI。 为了凑齐4个字节,还要在末尾补上一个"="号,最后得到的base64编码就是: "YWI="

微信截图_20201220154217.png

如果原始字符只有一个字节,原理是类似的,第二个字节除了前面补两个0,还要在后面补4个0,得到的字符串是YQ,剩下两个字节也用等号“=”来凑。所以a的base64编码就是 YQ==

微信截图_20201221000055.png

总结一点就是只要原始字符串的长度不能被3整除,后面的位都会用0来补充。

base64用在哪些场景

1、html中的图片用base64表示

打开google的首页,就能看到某些样式中的图片不是一个资源地址,而是base64编码的字符串,这么做有什么好处呢? 当然是减少了一次http的请求,但也并不是什么图片都适合用base64来处理,因为图片越大,转换的base64的字符串就越长,对带宽的要求更高了。

微信截图_20201221002353.png

2、邮件传输

早期电子邮件的收发只允许使用ascii字符,这就导致无法发送非ascii字符,图片等二进制文件。所以在MIME对电子邮件进行了扩展,该扩展协议就指定了内容的传输的编码格式,可以是base64,base64编码使得在电子邮件中传输图片成为可能。

当然也可以将base64的内容放在url中传输。

在主流编程语言中,都内置的base64模块,可以直接调用,无需自己重复造轮子

python 示例

# 编码
>>> base64.b64encode(b'abc')
b'YWJj'

# 解码
>>> base64.b64decode(b'YWJj')
b'abc'

​除了基本的base64,还有一种url safe 形式的编码方式,目的是将“+/” 替换成 “-_”, 因为标准的Base64并不适合直接放在URL里传输,URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换。

>>> base64.b64encode(b'i\xcf\xbf')
b'ac+/'

# 使用"url safe"的base64编码会把+/ 替换成 -_
>>> base64.urlsafe_b64encode(b'i\xcf\xbf')
b'ac-_'

base64 是加密算法吗?

base64不是加密算法,他只是一种编码方式,数据从一种形式转换为另一种形式进行传输/存储。

有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK