挣扎着膨胀算法

时间:2011-09-12 17:23:27

标签: javascript algorithm inflate

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

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

来自RFC的第3.1.1节:

  • 位从右向左读取,因此标题的第一位BFINAL1

     00001011
            ^
    
  • 数字首先打包LSB,我们从右向左阅读,因此BTYPE01

     00001011
          ^^
    
  • 这是固定的霍夫曼代码块类型,所以我们接下来要求一个霍夫曼代码。霍夫曼代码首先打包MSB,因此第一个代码是10000100(我们继续到下一个字节):

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

  • 接下来,下一个代码为10010101(= 0x95),其为字面值0x65,即“e”。

......等等。