Javascript 与膨胀算法斗争
即使在阅读了RFC并回顾了c和javascript实现之后,我也很难理解充气算法是如何工作的。我用文本“TestingTesting”压缩了一个文件,得到了以下十六进制结果:0b492d2ec9cc4b0f8150000 我尝试在16位和32位endian交换后读取数据,但在读取前3位后,我无法进一步读取数据,因为接下来的5位没有意义。我做错了什么?如何解析 我使用过的参考资料: RFC 1951Javascript 与膨胀算法斗争,javascript,algorithm,inflate,Javascript,Algorithm,Inflate,即使在阅读了RFC并回顾了c和javascript实现之后,我也很难理解充气算法是如何工作的。我用文本“TestingTesting”压缩了一个文件,得到了以下十六进制结果:0b492d2ec9cc4b0f8150000 我尝试在16位和32位endian交换后读取数据,但在读取前3位后,我无法进一步读取数据,因为接下来的5位没有意义。我做错了什么?如何解析 我使用过的参考资料: RFC 1951 压缩器的输出是一个字节流。你为什么要做endian交换 以二进制形式查看前几个字节: 0B =
压缩器的输出是一个字节流。你为什么要做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
表示文字字节0-143,因此10111111
(=10000100
)是文字值0x84
,它是“0x54
”的ASCII代码T
- 继续,下一个代码是
(=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
表示文字字节0-143,因此10111111
(=10000100
)是文字值0x84
,它是“0x54
”的ASCII代码T
- 继续,下一个代码是
(=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的时间来正确地摸索你在四个要点中总结的内容这里有几个要点。