简介
base64是一个保存二进制数据的工具,将多种形式的二进制数据或其构成的文件以ASCII的形式保存,因为很多地方不支持直接的二进制文件保存或呈现,比如可以将图片直接转换成base64码嵌入HTML文档中,而避免使用网络http加载图片;
组成
A-Z a-z 0-9 + /
共64个字符(不信自己数一下);
转换
-
如果是图片直接转换成二进制文件,字符先转换成ASCII字符码,再转换成二进制;网上直接搜“base64转换工具”就会出来很多在线转换网站,上传图片或者输入文本,一键转换;
-
将上面的64个字符按上面顺序排列得到64个索引,索引从0开始,63结束;
-
因为 64 = 2^6,所以要使二进制包含64种不同情况,需要取6比特位,即
000000
这种,把之前文件转换得到的二进制数据按每6比特位取一次,然后得到一个6位二进制数再转换成相应十进制数,这个数就是索引,然后按照索引取相应的64字符中的某一个,最后把所有取得的字符连接就是base64码; -
编码需要原文本总字节数(字符数)能被3整除(字节数除以3无余数),因此取到最后的字符时如果凑不够,缺位全部用
0
补齐,最后的只要是全为0的6比特位,全部转换成字符=
,所以最多会出现2个 =;
使用
假设一个 .png 图片转换得到的base64码为 abcdefg
,标准格式为:
data:image/png;base64,abcdefg
在浏览器地址栏输入以上字符串回车就能看见图片了,一般浏览器都支持解析base64码(里面的base64码换成自己的);
或者用在html的 img
标签中:
<img alt="" src="data:image/png;base64,abcdefg" />
再或者用在markdown格式文本中:
![base64](data:image/png;base53,abcdefg)
可以把 data:
看成像 http:
一样的一种协议,下面是其他格式,根据格式应该就能猜到其用途:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
效果
例如下面的星星图标:
其实它的base64码是这样的:
iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAA
AA2UlEQVR4AZWSAQZCQRCGv05QgXpQqCggukAgQeSpEwRE
oO4Qqg5RoYA6T6GqIIACvKqMMdZK9C1r5t+dmbE7/E+SKj
26nz3BV9IseTlrSQqPHGc9jIjUOlPAIeBiGdZszD4SYCyc
MjXqjjdHifM0cUuMGAfzn8QRQnGGdAgpAlAipMNQgtsIfY
nZkcUly070PsJAU18pg1LmquoAoWUdjEAZm9byG28AFSpA
028cZioFTHkQMSGjysx/zBsnK3Li/tkvpHDI2wVb7MnjEb
D6+cFGQkalZ6PyD2/u1Ikpara+FgAAAABJRU5ErkJggg==
为了显示方便所以进行了换行,理论上是很长的一行连续文本,中间不能有空格或者换行,这个图片仅有274字节(Byte)大,所以base64码还算短,几十上百K的图片就很长了,100K图片就有13万多个字符;
如果是文本的话,例如:
Hello World
以字符串 Hello
举例,后面类推,先将每个字符转换成ASCII码,再转换成二进制:
字符 | H | e | l | l | o | 空格 |
---|---|---|---|---|---|---|
ASCII | 72 | 101 | 108 | 108 | 111 | 32 |
二进制 | 01001000 | 01100101 | 01101100 | 01101100 | 01101111 | 01000000 |
以字符串 Hel
为例,将二进制转化成base64码:
字符 | H | e | l | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Base64补0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Base64结果 | S | G | V | s |
上面是不用补码的情况,即字符总数是3的倍数;下面是最后剩两个字符需要补码的情况:
字符 | H | e | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | ||||||||
Base64补0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Base64结果 | S | G | T | = |
然后是最后只剩一个字符的例子:
字符 | H | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | ||||||||||||||||
Base64补0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Base64结果 | S | A | = | = |
值得注意的是base64码 A
的二进制也是 000000
,上面例子中 A
的二进制码是部分补全后全为0,只有6个0全是补全的时候才都转换为字符 =
;