为什么会有base64 以及base64的说明和使用
一、为什么会有base64
首先,我们要知道所有数据在电脑中最终都是二进制数存储的,而在取数据时,是用不同的解码方式,将数据解码成自己想要的数据。Ascii
码是8位二进制数,范围是0-255
,gbk
是16位二进制数,范围更大…
而现在所有的电脑都是以Ascii
码编码方式存储的存储二进制数的,其他解码是在Ascii
码的基础上解码的。Ascii
的33-127
之间的值是可打印字符,可以在显示屏上显示出来,Ascii
码的0-32
及128~255
之间的值是不可打印字符,是一些控制符等等,这些在显示屏上是不能显示的。具体可以见下图:
1.主要原因:避免信息出错 和 查看二进制信息
(1)在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
(2)我们不知道二进制信息哪里出错了或者想查看二进制信息,有些二进制信息表示的信息无法打印出来。这时,我们需要一个二进制到字符串的转换方法。而Base64是一种最常见的二进制编码方法。
2.使用场景
- 对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。
- 电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
- 比如http协议当中的key value字段的值,必须进行URLEncode ,
因为一些特殊符号(等号或者空格)是有特殊含义的,造成混淆,解析失败,那么需要把这些值统一处理为可见字符,传输完再解析回来。 - 网页中一些小图片可以直接以base64编码的方式嵌入。不用再用链接请求消耗资源。
- 很多比较老的协议还是只支持纯文本的,比如SMTP协议。
有时在一些特殊应用的场合,大多数消息是纯文本的,偶尔需要用这条纯文本通道传一张图片之类的情况发生的时候,就会用到base64
二、编码与加密
很多人都以为编码(Encoding)和加密(Encryption)是同一个意思。编码和加密都是对格式的一种转换,但是它们是有区别的。编码是公开的,比如下面要介绍的Base 64编码,任何人都可以解码;而加密则相反,你只希望自己或者特定的人才可以对内容进行解密。
三、base64的说明和使用
Base64是一种用64个字符来表示任意二进制数据的方法。
Base64的原理很简单,首先,准备一个包含64个可打印字符的数组:
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
3个字节一组的二进制转为一组4节,每节6位,即3*8 = 4*6
可以看见,用base64编码后,字符长度是原来的4/3
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
import base64
a = base64.b64encode(b'beijing')
print(len(a), a)
b = base64.b64decode(a)
print(len(b), b)
# 结果:
12 b'YmVpamluZw=='
7 b'beijing'
这里一个字母是8
位,所以3
个字母base64
编码是4
个字符,这里7
需要补两位,9*(4/3)=12
由于标准的Base64
编码后可能出现字符+
和/
,在URL
中就不能直接作为参数,所以又有一种"url safe"
的base64
编码,其实就是把字符+
和/
分别变成-
和_
:
import base64
a = base64.urlsafe_b64encode(b'beij\xff\xffing')
print(len(a), a)
b = base64.urlsafe_b64decode(a)
print(len(b), b)
# 结果:
12 b'YmVpav__aW5n'
9 b'beij\xff\xffing'
参考资料:https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184
https://www.cnblogs.com/cuihongyu3503319/p/5564265.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84740.html