1

即使在阅读了 RFC 并查看了 c 和 javascript 实现之后,我也很难理解膨胀算法的工作原理。我用文本“TestingTesting”压缩了一个文件,得到以下十六进制结果:0B 49 2D 2E C9 CC 4B 0F 81 50 00

我尝试在 16 位和 32 位字节序交换后读取数据,但在读取前 3 位后我无法进一步了解,因为接下来的 5 位没有意义。我做错了什么,如何解析?

我使用过的参考资料:RFC 1951 Javascript C

4

1 回答 1

12

压缩器的输出是字节流。你为什么要进行字节序交换?

查看前几个字节,作为二进制:

0B  = 00001011
49  = 01001001
2D  = 00101101  
2E  = 00101110
...

从 RFC 中的第 3.1.1 节:

  • 位是从右到左读取的,所以标题的第一位,BFINAL,是1

     00001011
            ^
    
  • 数字首先压缩 LSB,我们从右到左读取,所以BTYPE01

     00001011
          ^^
    
  • 那是固定的 Huffman 代码块类型,所以我们期待下一个 Huffman 代码。霍夫曼代码首先打包 MSB,所以第一个代码是10000100(我们继续这里的下一个字节):

     00001011
     ^^^^^
     01001001
          ^^^
    
  • 查看第 3.2.6 节中的表格,00110000表示10111111文字字节 0 - 143,因此10000100(= 0x84) 是文字值0x54,它是“ T”的 ASCII 码。

  • 继续,下一个代码是10010101(= 0x95),它是文字值0x65,即“ e”。

...等等。

于 2011-09-12T20:32:51.107 回答