如果你还不清楚 JackHttp 是什么,请戳这里!!!
JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因:
- HTTP 在网络传输过程中是明文的。
- HTTP 在网络传输过程中内容有可能被中间商篡改的。
- 浏览器,服务器都要求 HTTP 2.0 基于 HTTPS,而 HTTPS 使用到对称加密,非对称加密,Hash 算法。
- 编码和加密在我们 URL 文字编码、HTTPS 连接,TCP 连接中都经常使用。
带着这 4 个原因,开始我们今天的内容。
编码
很遗憾,说起来你可能不信,编码的定义从计算机发展至今,还没有一个完整的官方定义,(如果你有找到,请一定要告知我,感谢!)
但借助一些相对权威的机构定义及自己对编码的理解,浅谈一些编码相关的知识。
什么是编码?
编码是任意一种数据从一种形式或格式转换为另一种形式或格式,并且支持转换回来的过程。
Base64
好像很熟悉,但具体让我们说说 Base64 是啥?可能又说不上来,那么我问几个问题,大家思考下。
- Base64 是编码吗?
- Base64 是加密吗?(平时应该听过 Base64 加密这种说法吧)
- Base64 转换后的数据会变的更加安全吗?
- 使用 Base64 能提高效率吗?
- 为什么使用 Base64 ,Base64 的使用场景有哪些?
希望读者可以简单思考后,再阅读下文。
什么是 Base64?
将二进制数据转换成由 64 个字符组成的字符串编码算法。
具体由以下 64 个字符组成。
包含 “大写的 A -> Z 26 个字母 , 小写的 a -> z 26 个字母, 阿拉伯数字 0 -> 9 10个数字,运算符 + /” 共 64 个可见字符 。
了解到这里你可能会比较奇怪,为什么一定要用 64 个字符呢?
Base128 ,Base256 , Base32 不行吗?
ok,那么我们来弄明白 Base64 的编码原理,以上问题都将得到答案。
Base64 编码原理
例如我们需要对字符串 “Jack” 进行 Base64 编码,步骤如下:
-
将 "Jack " 拆分成 "J "、"a "、"c "、"k " 4 个字符,并获取到每个字符的 ASCII 码值。
通过 ASCII 码对照表 我们可以获取到 "J "、"a "、"c "、“k " 的 ASCII 码值对应为"74”、"97 "、“99”、"107 "。 -
Base64 是对二进制数据进行转换,所以我们需要将 ASCII 码值转换成对应的二进制数据,“01001010”、"01100001 "、“01100011”、“01101011”。
-
对二进制数据进行读取,为了确保转换后的任意数据都能用 64 个字符表表示出来,我们对二进制数据进行排列组合,如下图:
组合后会发现,64 个字母的字母表,最多可对应 26,也就是 Base64 一次转换读取最多只能读取 6 Bit,否则就有可能造成部分转换后的字符无法正常显示,出现乱码,转换后数据如下图:
解释: 一个英文字母占一个字节,一个字节占 8 Bit。
-
将转换后获得的二进制数据转换成 Base64 字符表中的“十进制索引”,然后对应 Base64 字符表索引取出索引值,以此获取最终转换后的数据。
注意:最后 1 位 Bit 数据读取如果如果长度< 6 ,则补 0 ,例子中最后的 “11”,转成十进制前的数据补码后的值为"110000 "。