Floating Cat

简析Base64原理

字数统计: 708阅读时长: 2 min
2016/01/01 Share

Base64起源

在网络传输中,有些方式并不支持所有的字节,比如早起邮件系统支持传输可见字符,而对于ASCII中的控制字符就无法传输.在比如在传图图片时,由于图片对应的二进制流中的字节有些事不可见字符,因此也就无法进行传输,那怎么在不修改传输协议的前提下,来支持所有的字节传输呢,换言之就是讲不可见字符表示为可见字符?

而Base64就是该问题的一种解决方案,它是一种基于64个可见字符来表示二进制数据的方法.

Base64编码规则

Base64首先定义一个可见字符的索引表,按照规定,字符选用了A-Z、a-z、0-9、+、/这64个字符.

  • 接下来首先将待转换的字符串每三个化为一组,由于每个字符占一个字节,因此一组三个字符占3个字节,共24位.

  • 然后将上面的24个二进制位按照6位一组,划分为4组.

  • 在每组前面填两个0,每组由6位变为8位一组,即由4组6位,变成4组8位,共4字节.

  • 然后将每个字节转为十进制,并从字符索引表中取出对应下标处的字符.

字符索引表结构如下:

image-20181120152040773

abc编码实例

假设我们要将abc进行编码,根据上述流程,其变化如下:

image-20181120151944396

因此对abc编码之后的结果为YWJj.

在转换过程中,如果到最后发现最后字符不够3个情况,那么此时可以在最后追加相应个数的=符号即可,补齐规则如下:

  • 2个字节:2个字节共16个二进制位,按照规则进行分组,每6位一组,则第3组缺少2位,用0补齐后边,由于第4组完全没有数据则用=补上即可.

  • 1个字节:1字节共8个二进制位,按照规则进行分组,每6个一组,则第2组缺少4位,用0补齐后边,由于后面两组没有对应数据,直接都用=补上即可.

A编码实例

以对A进行编码为例,其过程如下所示:

image-20181120151845402

最终编码结果为QQ==.

AA编码实例

以对AA进行编码为例,其过程如下所示:

image-20181120151753037

最终编码结果为QUE=.

总结

在Base64编码过程中,涉及到填充操作,因此相比原来会占用更多的空间,通常Base64编码后的文本要比原来大1/3.此外,为什么Base64要以3个字节为一组呢?因为6和8的最小公倍数为24,3个字节正好是24位,每6个bit位一组,恰好能够分为4组.

CATALOG
  1. 1. Base64起源
  2. 2. Base64编码规则
    1. 2.1. abc编码实例
    2. 2.2. A编码实例
    3. 2.3. AA编码实例
  3. 3. 总结