Base64编码

Base64简介

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种基于64个可打印字符来表示二进制数据的方法。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息,具有不可读性,需要解码后才能阅读。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

简单来说,Base64就是一种字符映射规则,通过这种字符映射规则的编码方式称为Base64编码。由于编码表由64个基础可打印字符组成,在传输的字符并不全是可打印的字符,比如二进制文件、图片等的时候,能避免在传输过程中丢失数据(不可打印字符在传输过程中可能会被当做特殊字符处理,从而导致丢失)。

编码原理

索引表

索引表字符选用了由标准的Base64协议规定的"A-Z、a-z、0-9、+、/" 这64个可打印字符。

索引对应字符索引对应字符索引对应字符索引对应字符
0A1B2C3D
4E5F6G7H
8I9J10K11L
12M13N14O15P
16Q17R18S19T
20U21V22W23X
24Y25Z26a27b
28c29d30e31f
32g33h34i35j
36k37l38m39n
40o41p42q43r
44s45t46u47v
48w49x50y51z
520531542553
564575586597
60861962+63/

在Base64的编码结果中我们还会看到“=”或“==”出现,“=”在此是作为填充字符出现。

转换步骤

  1. 将待转换的字符串每三个字节分为一组,共24位:
    下面以字符串"Man"为例,当前分组即为每个字节一组:[01001101],[01100001],[01101110]
  2. 将这24位字符按每6个为一组重新分组,并在每个新的分组前加两个0:
    新的分组:[010011],[010110],[000101],[101110]
    加0后:[00010011],[00010110],[00000101],[00101110]
    新增8位,此时,总字节数变为4个字节,分别为9,22,5,46。
  3. 按新的字节对应上面的索引表获取编码后的字符,即字符串"Man"经过Base64编码后得到的字符串为"TWFu"。

补零处理

通过不断将每3个字节转换为4个Base64字符之后,最后只会出现以下3种情况:

  1. 没有字节剩下
  2. 还剩下1个字节
  3. 还剩下2个字节

第一种情况不用做处理,后面两种情况采用补零的方式,最后一个6位分组差几位就补几位0,即剩1个字节的时候补4位0,剩2个字节的时候补2位0:
红色的为补位
这里的0也就是我们在Base64编码尾部经常见到的“=”的来历,每补2个0就会添加1个“=”。尽管不填充“=”时我们也能根据实际对剩余字符进行处理,但是这种填充在某些情况下是必需的,例如当需要将多个Base64编码文件合并为一个文件的时候。

其他

  1. Base64编码只是一种编码规则,只是无法直接看到明文,不能算得上加密。尽管我们可以通过打乱Base64编码的索引表来达到加密的效果,但是考虑到Base64编码的编码过程实际上就是一种字符替换法,可以通过观测基于词频和字母频率的统计规律较为轻易地获得秘钥,因此安全性并不能得到有效的保证。
  2. 不同中文编码下,如gb2312、utf-8,对应的Base64编码也不一样。
  3. Base64编码根据索引表的不同有很多变种,例如将“+”、“/”改为“-”、“_”,同时去除“=”的填充,就可以将其用于URL传输。

参考文献:
[1]: 百度百科 https://baike.baidu.com/item/base64
[2]: 维基百科 https://www.bk.gugeso.site/wiki/Base64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值