数据编码方式介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.Base64
这里讨论的编码主要的目的是将不可显示的二进制数组转变为可显示的字符串,包括其逆运算。通过特定的协议传输数据,或者加密解密的时候都会用到类似的方法。在这类运算中用的比较多的是Base64,比如MIME中,DotNET中更是直接提供了Base64 Encode和Decode的方法,相当方便。但是Base64通常由“a-z”、“A-Z”、0-9以及“+”和“=”这些符号组成,当中包含了很多混淆的字符,例如“1”、“I”和“l”,“0”和“O”或者“2”和“Z”,看起来总是不爽。特别是当作为序列号编码时,是不应该包含容易混淆的字母,所以有另一种编码形式叫做Base24,用过MS产品的兄弟们一定非常熟悉。但是Base24在实现上还要多绕一个弯,先放一放,我们在下面说Base32,能够基本满足要求的,又非常直观的编码方式。Base32的原理和Base64一模一样,所以先看一下Base64编码是怎么一回事。
Base64顾名思义就是用64个可显示字符表示所有的ASC字符,64也就是6Bits,而ASC字符一共有256个,也就是8Bits,很简单了,取一下最小公约数,24位,言下之意就是用4个Base64的字符来表示3个ASC字符。即在编码时,3个一组ASC字符,产生4个Base64字符,解码时4个一组,还原3个ASC字符。根据这个原理Base64编码之后的字符串应该比原先增加1/3的长度。
这里所谓的编码就是一次取6Bits,换算出来的值作为索引号,利用这个索引数,到预先定义的长度为64的字符数组中取相应的字符替换即可;解码就是逆运算,根据字符取在预定义数组中的索引值,然后按8Bits一组还原ASC字符。
Base32和Base64相比只有一个区别就是,用32个字符表示256个ASC字符,也就是说5个ASC字符一组可以生成8个Base32字符,反之亦然。
2.Base32
2.1.Base32数据编码简介
Base32数据编码机制,主要用来把二进制数据编码成可见的字符串,其编码规则是:任意给定一个二进制数据,以5个位(bit)为一组进行切分(base64以6个位(bit)为一组),对切分而成的每个组进行编码得到1个可见字符。Base32编码表字符集中的字符总数为25=32个,这也是Base32名字的由来。以下是我在网上找的一个标准的Base32编码表,如表1所示。
表1 标准Base编码表
2.2.编码演示
下面对“bhst”字符串进行编码,说明Base32的编码过程。步骤如下:
(1)字符“bhst”取ASCII码之后,对其转换成二进制,得到共以下的四个字节是,“1100010,1101000,1110011,1110100,”,28个bit的二进制串。因为base32是属于传输8bit 字节代码的编码方式,所以这里要对“bhst”字符串对应的二进制最高位加0变成每组8个bit。组成32个bit的二进制串.
(2)以5个bit为一组对“bhst”字符串对应的二进制串进行切分。得到“01100,01001,10100,00111,00110,11101,00000”7个字节的“bhst”二进制串。其中,每组的二进制串不足5个用0补充。
(3)计算每组二进制串所对应的十进制,然后参考标准Base32编码表,找出所对应的编码字符,组合成密文。注:最后一个分组位数不足4个的时候,则用字符“=”编码。如表2所示:
表2 以5个bit为一组切分得到7个字节的目标二进制串及对应的标准Base32编字符
2.3.实例解码
以密文“I4AG6AA=”为例。步骤如下:
(1)对密文中的编码字符(对照标准Base32编码表)找出所对应的十进制编码值。分别为:8 28 0 6 30 0 0。
(2)把十进制的编码值转换成二进制,不足5个bit用0补充。得到:01000,11100,00000,00110,11110,00000,00000
(3)组合每组的二进制串,并以8个bit为一组进行切分。得到:01000111,00000000,01101111,00000000,00000000
(4)还原每组二进制串得到明文的ASCII码71 0 111 0 0,还原成字符为Go。如表3所示:
表3