写点什么

计算机编码规则之:Base64 编码

作者:程序那些事
  • 2022 年 3 月 21 日
  • 本文字数:1748 字

    阅读完需:约 6 分钟

计算机编码规则之:Base64编码

简介

我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件。一般来说二进制文件如果用文本编辑器打开的话会显示乱码,并且二进制文件和文本文件的存储和传输方式是不一样的,那么有没有什么办法将二进制文件转换成为文本文件进行传输或者存储呢?答案是肯定的。


这种编码方式就是我们今天要讲到的 Base64 编码。

Base64 和它的编码原理

Base64 是一种将二进制编码格式转换为 text 编码的一种形式。我们知道二进制编码是 0 和 1 的形式,它的单位通常是一个字节,也就是 8bits,每个 bit 表示的是 0 或者 1。


而文本编码的格式有很多种,最早也就是最简单的编码格式就是 ASCII 编码,ASCII 编码的全称是 American Standard Code for Information Interchange,也就是美国信息交换标准代码,它主要表示的是常用的一些西欧字符。


ASCII 的编码范围是 0x00-0x7F,用十进制来表示就是 0-127,总共 128 个字符,刚好是 7bits 表示的范围。


ASCII 编码中包含了 33 个控制字符和 95 个可打印的字符,如下所示:



Base64 就是从 ASCII 编码中挑选出 64 个字符和二进制一个字节 8bits 进行映射,这也就是 Base64 中 64 的含义。为什么要选择 ASCII 编码呢?这是因为 ASCII 编码是最早出现的编码形式,几乎所有的计算机应用都对其完全支持,不会出现数据传输过程中的内容转换,非常的安全。


当然 Base64 编码也有多种编码形式,比如在 MIME 中,Base64 选择的是 A-Z, a-z, 和 0-9 总共 62 个字符,再加上其他自选的两个字符组成了 64 个编码字符。


64 个字符用二进制表示是 6bits,而常用的二进制使用一个字节来表示,也就是 8bits,那么问题来了,怎么将 8bits 的二进制用 6bits 的 Base64 字符来表示呢?


很简单,我们只需要将 3 个 8bits 连接起来,变成 24bits,这样就可以用 4 个 Base64 来表示了。


为什么必须对二进制进行转换呢?这是因为互联网中的某些传输协议只支持某些特定的字符集,如果是其他的字符集是不支持的。比如说常用的发送电子邮件的附件。因为 SMTP 协议最开始设计的时候是支持 7 位 ASCII 字符,所以如果要传输文件的话,我们需要对文件进行编码之后再进行传输。


另外 Base64 的一种用法就是在 HTML 中将图片嵌入到网页中,从而实现图片的展示。


虽然 Base64 很好用,但是因为其只能使用 6bits 的字符映射集,所以会造成数据映射的损失,从而导致二进制文件编码过后文件体积变大的缺点。

Base64 的变体

Base64 简单点说就是 bit 到 bit 之间的映射,那么肯定不止一种映射方式,我们来看下 Base64 编码方式的各种变体,通常来说前 62 位基本上是一样的,不同之处在后面两个字符,以及用于填充的字符(这在某些协议中可能是强制性的,或者在其他协议中可能被删除)。


下表是常见的 Base64 编码的变体:


Base64 的编码细节

上一节我们讲到了 Base64 编码的基本原则和一些常见的变体,那么到底是如何进行映射的呢?


本节我们会以 Base64 的标准形式 RFC 4648 为例来进行详细的讲解。


RFC 4648 选择+和/这两个字符作为编码中的第 62 位和 63 位,并且选择=作为补全字符。


首先来观察一下 RFC 4648 的映射表:



我们来以单词 man 为例,来观察一下 Base64 的编码流程。


man 这个单词在 ASCII 中分别用 77, 97 和 110 表示,转换成为二进制就是 01001101, 01100001 和 01101110。


将上面的三个二进制合并在一起就成了:010011010110000101101110, 总共 24-bit,从上面的表中选择出对应的字符,所以我们可以得到 man 经过 base64 编码之后得到:TWFu。


上面的例子中,man 刚好是 3 个字符,也就是 24 个 bits,可以用 base64 完整的表示。如果我们只有 ma 这两个字符,应该怎么进行编码呢?


和上面一样,ma 的二进制分别是 01001101, 01100001,合并起来就是 0100110101100001。


但是上面的 bits 只有 16 位,因为一个 base64 是 6bits,所以可以用 3 个 base64 来表示,因为原始的 bits 少了两位,所以用 0 来补全:


0100110101100001+00 = 010011010110000100。


010011010110000100 转换成为 base64 就是 TWE,因为 base64 编码需要 4 个字符,所以最后的字符用=来补全,也就是说 me 经过 base64 之后变成 TWE=。

总结

以上就是 Base64 的基本含义和转换规则,其实协议很简单,将要转换的数据变成二进制,然后对照转换表格进行转换和补全即可。


本文已收录于 http://www.flydean.com/18-base64-encoding/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 3 小时前阅读数: 5
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
计算机编码规则之:Base64编码_Java_程序那些事_InfoQ写作平台