作为 电子邮件、图片 等场景最常用的编码算法,Base64 的地位无可撼动。究其原因呢?我们很多协议要求数据传输只能由ASCII文本传输,而 ASCII 中 128 ~ 255 之间的值是不可见的,而在网络传输中经过的不同设备对于数据的处理方式不一,容易导致不可见字符出现一些不愿意见到的错误处理,这样就很不利于传输,所以通过 一种编码进行转化为可见字符,统一按照普通字符进行处理,so…经过发展,就有了今天的 Base64。
Base64编码原理
Base64编码
之所以被称为 Base64,是因为它采用了64个字符来对任意数据进行编码,同理还有 base32、base16 编码。标准 Base64 使用的字符为:
Base64编码
本质上是一种将二进制数据转换成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式,然后每连续 6bit
(而 2的6次方 = 64
) 计算其十进制,根据该值在上面索引列表找到对应的字符,最终得到一个文本字符串。操作起来如下几点:
- 每
3个8bit
的字符为一组 - 针对每组,首先获取每个字符的
ASCII编码
- 将
ASCII编码
转换成8bit二进制
,得到一组3 * 8 = 24bit
的字节 - 将
24bit
划分为4 * 6bit
字节,并在每个6bit
的字节前面都填两个高位0,得到4 * 8bit
字节 - 将
4 * 8bit
的字节转换成十进制,对照Base64编码字符表
得到对应的字符串
例子走起:
字符串长度为 3 的整数,比如
abc
字符串长度不为 3 的整数,比如
abcd
,后面有2 * 6bit
属于补位字节,可以看成 “异常填充”,Base64字符对应=
,所以经常会看到有些数据最后是=
结尾,视为结束符号,换句话说出现=
则意味着结尾了
如果Base64编码字符串不会相互拼接再传输,那么最后的 = 也可以省略,解码时如果发现Base64编码字符串长度不能被4整除,则先补充 = 字符,再解码即可
解码是对编码的逆向操作,但注意一点:对于最后的两个 = 字符,转换成两个 A 字符,再转成对应的两个6比特二进制0值,接着转成原始字符之前,需要将最后的两个6比特二进制0值丢弃,因为它们实际上不携带有效信息
代码实现
示例项目源码: base64_principle.c
本文作者: wettper
本文链接: http://www.web-lovers.com/c-base64-principle.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!