有时候,我们需要把字节流打印出来,而且要求打印出来的字符容易记忆,容易还原到字节数据去。 比如,常用的那些哈希算法得到的是固定长度的字节数组, 那么如何让这个结果可打印呢?Base16
编码方案就是为了解决这个问题的。
Base16
这个名字可能用的比较少,实际上,我们通常使用hex
这个名字。
Base64
编码的最新规范是:RFC4648
Base16
编码可以将任何二进制的数据编码到可打印的16
个字符之中。
Base16
编码后的字符串中可能出现的字符:
Base16
编码后的字符串中最多可以出现16 = 6 + 10
种字符。
Base16
编码是大小写不敏感的,所以,'A'
~'F'
和'a'
~'f'
都可以使用。
用4bit
可以表示2^4 = 16
个数字,所以, 用4bit
可以表示完所有的十六进制数
。
由于1byte=8bit
,所以,1byte
可以表示2
个十六进制数
。
这里就涉及到了字节序的问题,拆分后,到底采用小端模式
还是大端模式
呢?Base16
编码规范明确规定使用大端模式
。
假设:有一个字节的二进制表示为10100101
,那么,我们先把这一个字节分成2组, 从左到右依次为1010
和0101
,这2组二进制数字分别转换成十进制数
依次为10
和5
,分别把10
和5
作为数组的下标,从下面的表格中查询得对应序号的十六进制数
,分别为A
和5
,所以,最终,这一个字节的Base16
编码就是A5
, 当然,您也可以使用小写字母,这也是允许的。
Base16
编码的算法把一个byte
拆分成两个字节,这就出现了字节序问题,Base16
编码的算法选择使用大端模式
,实际上,我们还可以选择使用小端模式
。
Base16
编码索引与对应字符的表格,其实也可以改变的,您也可以替换为其他的16个字符,只要您愿意。
经过您自己修改后的变种Base16
编码能达到一定的加密效果,因为只有您自己知道那个索引表。所以您在使用的时候, 任何使用者都需要使用您修改后的这个算法,而不能使用标准的Base16
编码算法。