对于base64的使用及个人理解
注:本人并非专业人员,本文章仅是个人观点,如有疏漏或错误,请各位大佬指点。谢谢
Base64,中文译名”基于64个可打印字符来表示二进制数据”,顾名思义,这是一种利用64个可打印字符(大写A-Z,小写a-z,数字0-9,及+,/(在一些变种中+/也可能是其他字符))表示数据的编码方式,至于具体运用……本人也不是专业的,不了解base64具体运用场景,只知道有些人用来装b,某些游戏作者用来在游戏里搞事情而已。
你瞅哪呢Team Salvato,说的就是你
那么我们闲言少叙,书归正传。从base64的编码开始谈谈我对base64的理解
1.base64的使用(仅为纯英文数据的编码解码)
要使用base64编码或解码,首先需要两张对照表,一张是ASCII表,用于将要编码的数据转换为二进制形式的数据;另一张是base64的编码表,用于将二进制数据转换为64个可打印字符的形式。
注:编码数据应转换为为二进制后进行编码
有了两张表之后我们就可以开始编码了
例如我们将'hi'用base64编码
先在ASCII表中找出h和i的数值
分别是104,105
转换为8位的二进制形式为
0110 1000和0110 1001
将其罗列后得到
0110 1000 0110 1001
一串二进制数据
再将其以6个比特为一组写出
得
011010
000110
1001
此时我们会发现,最后一组不满6个比特
此时我们只需要在最后一组补充0到六位即可
可得到三组数据
011010 000110 100100
将其转换为10进制数据可得
26 6 26
带入base64编码表中便可得到最终的编码结果为
aGk=
注意此时结尾存在一个=号
此=仅用作填充,对解码结果无大影响
在一段base64编码中仅会存在1或2个=
且在无=的情况下编码不会出现1个字符或5的倍数个字符
在原字符占3的倍数字节时编码结果无=
注:base64的编码结果必须区分大小写,否则将与原数据不符
2.对部分原理的理解
上面我们叙述了base64编码的方式,下面我们就着以上的一些理论分析其原理及概念
首先,我们说说ASCII是什么
ASCII,全称American Standard Code for Information Interchange,中文名美国信息交换标准代码,是一种基于拉丁字母的一套电脑编码系统
这是ASCII的概念
众所周知
计算机中无论什么数据本质都是一段二进制数据
那么每个字符都会存在一个对应的二进制数据
具体用哪个数据表示某个字符,这个所有人都可以有自己的一套编码
但这时就会出现一个问题
当两个人用着不同的编码时便无法传达正确的信息
就比如我定义a为1,而你定义b为1
那么我向你传输信息'a'的时候,你收到的信息会变成b
这就非常尴尬
为了防止这样的事情产生,便需要大家都使用一套标准
ASCII便是这么一套国际标准。
说完ASCII
我们继续谈base64
首先我们前文说过,在原字符串有3的倍数个字符时结尾不会出现=
这一点的原因大概如下:
首先base64会将每三个字节转换为4个可见字符
由于一个字符占一个字节8个比特,而base64以6个比特为一组生成字符
所以此时base64编码后的字符串与原文所占比特皆为24
这时3个原字节刚好占base64的四个字符所以此时不需要=来进行填充
另外我之前提到过
一段base64码中只会出现1或2个=和不会出现1或5倍数个字符
这要根据之前提到的“一个字符占一个字节8个比特,而base64以6个比特为一组生成字符”来理解
我们将5写成(4+1)便很好理解了
由于3*8=6*4
所以4个字符可视为一组
而又于每个字符占8个比特
必然会出现至少两个字符
为何只会有1或2个=也同理
3.拓展,关于base32
base32,与base64同理,不过从6比特出一字节该为5比特出一字节
而同样,base32同样需要补足
需要补充到8位,即40个比特(5*8=8*5)
此时不会出现的字符个数为1或9的倍数
等号数量大于0小于6
理由与base64相同
注意,base32编码中只有大写A到Z和数字1到7
相较于base64
base32所占空间更大
我们可以做一个实验,将一个数据分别进行base64和base32编码
再看其所占内存便可
就拿之前用过的hi举例
很明显,在编码字符数相同时,base32所占空间大于base64所占空间
以上,便是我对于base64部分原理的理解及对于ASCII的理解
最后强调一点
本人并非专业人员,本文章仅是个人观点,如有疏漏或错误,请各位大佬指点。不喜轻喷,谢谢。
另:部分素材来自网络