Javascript 与膨胀算法斗争

Javascript 与膨胀算法斗争,javascript,algorithm,inflate,Javascript,Algorithm,Inflate,即使在阅读了RFC并回顾了c和javascript实现之后,我也很难理解充气算法是如何工作的。我用文本“TestingTesting”压缩了一个文件,得到了以下十六进制结果:0b492d2ec9cc4b0f8150000 我尝试在16位和32位endian交换后读取数据,但在读取前3位后,我无法进一步读取数据,因为接下来的5位没有意义。我做错了什么?如何解析 我使用过的参考资料: RFC 1951 压缩器的输出是一个字节流。你为什么要做endian交换 以二进制形式查看前几个字节: 0B =

即使在阅读了RFC并回顾了c和javascript实现之后,我也很难理解充气算法是如何工作的。我用文本“TestingTesting”压缩了一个文件,得到了以下十六进制结果:0b492d2ec9cc4b0f8150000

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

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

压缩器的输出是一个字节流。你为什么要做endian交换

以二进制形式查看前几个字节:

0B  = 00001011
49  = 01001001
2D  = 00101101  
2E  = 00101110
...
根据RFC第3.1.1节:

  • 位是从右向左读取的,因此头的第一位,
    BFINAL
    ,是
    1

     00001011
            ^
    
  • 数字首先被压缩为LSB,我们从右到左读取,因此
    b类型
    01

     00001011
          ^^
    
  • 这是固定的哈夫曼代码块类型,所以我们期待下一个哈夫曼代码。哈夫曼代码首先压缩为MSB,因此第一个代码是
    10000100
    (我们在这里继续下一个字节):

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

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


…等等。

压缩器的输出是一个字节流。你为什么要做endian交换

以二进制形式查看前几个字节:

0B  = 00001011
49  = 01001001
2D  = 00101101  
2E  = 00101110
...
根据RFC第3.1.1节:

  • 位是从右向左读取的,因此头的第一位,
    BFINAL
    ,是
    1

     00001011
            ^
    
  • 数字首先被压缩为LSB,我们从右到左读取,因此
    b类型
    01

     00001011
          ^^
    
  • 这是固定的哈夫曼代码块类型,所以我们期待下一个哈夫曼代码。哈夫曼代码首先压缩为MSB,因此第一个代码是
    10000100
    (我们在这里继续下一个字节):

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

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


…等等。

请发布您的代码,以便我们能够实际帮助您。我们还不能读懂思想,所以如果没有一个例子,就很难判断问题在哪里。我还没有写任何代码,因为我仍在试图理解如何正确解析位。在我理解了算法之后,编码和验证会容易得多。我希望有人能帮我分解并解析前几个代码示例中的位。你如何“在16位和32位endian交换后读取数据”并获得“在读取前3位后,我无法获得更多,因为接下来的5位没有意义”?手动解析。例如:0B 49=0000 1011 0100 1001,将字节交换为endian转换,然后读取第一位,它是0(不是最后一个块),接下来的2位=10(静态表),然后接下来的5位=01001,它应该是文字代码257的数量,但对于我使用的示例文本文件“TestingTesting”来说没有意义好的,那么在您的原始问题中发布几个链接,链接到您已经回顾过的充气算法和实现,怎么样。我对它还不太熟悉,不能用头顶上的手来做。请发布你的代码,这样我们才能真正帮助你。我们还不能读懂思想,所以如果没有一个例子,就很难判断问题在哪里。我还没有写任何代码,因为我仍在试图理解如何正确解析位。在我理解了算法之后,编码和验证会容易得多。我希望有人能帮我分解并解析前几个代码示例中的位。你如何“在16位和32位endian交换后读取数据”并获得“在读取前3位后,我无法获得更多,因为接下来的5位没有意义”?手动解析。例如:0B 49=0000 1011 0100 1001,将字节交换为endian转换,然后读取第一位,它是0(不是最后一个块),接下来的2位=10(静态表),然后接下来的5位=01001,它应该是文字代码257的数量,但对于我使用的示例文本文件“TestingTesting”来说没有意义好的,那么在您的原始问题中发布几个链接,链接到您已经回顾过的充气算法和实现,怎么样。我对它不太熟悉,不可能从头开始就用手去做。+1为了简洁易读的回答-我花了半打读RFC1951的时间来正确地摸索你在四个要点中总结的内容。+1为了简洁易读的回答-我花了半打读RFC1951的时间来正确地摸索你在四个要点中总结的内容这里有几个要点。