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