即使在阅读RFC并查看c和javascript实现之后,我也很难理解inflate算法的工作原理。我使用文本“TestingTesting”压缩了一个文件,并以十六进制获得了以下结果:0B 49 2D 2E C9 CC 4B 0F 81 50 00
我尝试在16位和32位字节序交换后读取数据,但在读取前3位后我无法再进一步,因为接下来的5位没有意义。我做错了什么,如何解析?
我用过的参考资料: RFC 1951 Javascript C
答案 0 :(得分:10)
压缩器的输出是一个字节流。你为什么要进行端点交换?
查看前几个字节,如二进制:
0B = 00001011
49 = 01001001
2D = 00101101
2E = 00101110
...
来自RFC的第3.1.1节:
位从右向左读取,因此标题的第一位BFINAL
为1
:
00001011
^
数字首先打包LSB,我们从右向左阅读,因此BTYPE
为01
:
00001011
^^
这是固定的霍夫曼代码块类型,所以我们接下来要求一个霍夫曼代码。霍夫曼代码首先打包MSB,因此第一个代码是10000100
(我们继续到下一个字节):
00001011
^^^^^
01001001
^^^
查看3.2.6节中的表格,00110000
到10111111
代表字面字节0 - 143,因此10000100
(= 0x84
)是字面值0x54
,它是“T
”的ASCII代码。
接下来,下一个代码为10010101
(= 0x95
),其为字面值0x65
,即“e
”。
......等等。