与膨胀算法作斗争
即使在阅读了 RFC 并审查了 c 和 javascript 实现之后,我仍然很难理解 inflate 算法的工作原理。我用文本“TestingTesting”压缩了一个文件,并得到了以下十六进制结果: 0B 49 2D 2E C9 CC 4B 0F 81 50 00
我尝试在 16 位和 32 位字节序交换后读取数据,但在读取前 3 位后我无法继续下去,因为接下来的 5 位没有意义。我做错了什么以及如何解析?
我用过的参考资料: RFC 1951 Javascript C
I'm having a difficult time understanding how the inflate algorithm works even after reading the RFC and reviewing c and javascript implementations. I compressed a file with the text "TestingTesting" and got the following result in hex: 0B 49 2D 2E C9 CC 4B 0F 81 50 00
I tried reading the data after 16 and 32-bit endian swaps but after reading the first 3 bits I can't get any further because the next 5 bits don't make sense. What am I doing wrong and how can this be parsed?
References I've used:
RFC 1951
Javascript
C
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
压缩器的输出是字节流。为什么要进行字节序交换?
查看二进制形式的前几个字节:
来自 RFC 中的第 3.1.1 节:
位是从右向左读取的,因此标头的第一位
BFINAL
是1
:<前><代码> 00001011
^
数字被压缩为 LSB首先,我们从右到左读取,因此
BTYPE
是01
:<前><代码> 00001011
^^
这是固定的 Huffman代码块类型,因此我们接下来期望的是霍夫曼代码。霍夫曼代码首先打包 MSB,因此第一个代码是
10000100
(我们在这里继续处理下一个字节):<前><代码> 00001011
^^^^^
01001001
^^^
查看第 3.2.6 节中的表格,
00110000
code> 到10111111
表示文字字节 0 - 143,因此10000100
(=0x84
) 是文字值0x54
,它是“T
”的 ASCII 码。继续,下一个代码是
10010101
(=0x95
),它是文字值0x65
,即“e”。
...等等。
The output from the compressor is a stream of bytes. Why are you doing an endian swap?
Looking at the first few bytes, as binary:
From section 3.1.1 in the RFC:
bits are read from right to left, so the first bit of the header,
BFINAL
, is1
:numbers are packed LSB first, and we read from right-to-left, so
BTYPE
is01
:That's the fixed Huffman code block type, so we expect a Huffman code next. Huffman codes are packed MSB first, so the first code is
10000100
(we continue on to the next byte here):Looking at the table in section 3.2.6,
00110000
to10111111
represent literal bytes 0 - 143, so10000100
(=0x84
) is the literal value0x54
, which is the ASCII code for "T
".Continuing, the next code is
10010101
(=0x95
) which is literal value0x65
which is "e
"....and so on.