微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何 zlib 膨胀 gzip/deflate 档案

如何解决如何 zlib 膨胀 gzip/deflate 档案

我有一个用 gzip 1.5 编码的档案。我无法使用 C zlib 库对其进行解码。 zlib inflate() 返回 EC -3 stream.msg = "未知压缩方法"。

$ gzip --list --verbose vmlinux.z
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 12169518 Apr 29 13:00             4261643             9199404  53.7% vmlinux

文件的前 32 个字节是:

00000000  1f 8b 08 08 29 f4 8a 60  00 03 76 6d 6c 69 6e 75  |....)..`..vmlinu|
00000010  78 00 ec 9a 7f 54 1c 55  96 c7 6f 75 37 d0 fc 70  |x....T.U..ou7..p|

我看到前 18 个字节是 RFC-1952 gzip 标头。 在 NULL 之后,我希望下一个字节是 RFC-1951 deflate 或 RFC-1950 zlib(我不确定是哪个)

所以,我通过 zlib inflate() 一个指向 @0x12 字节的 z_stream:next_in。

如果这是 deflate 编码,那么我希望下一个字节@0x12 是 0aabbbbb(BFINAL=0 和 BTYPE=some 压缩)

如果这是 zlib 编码,我希望下一个字节@0x12 采用 0aaa1000 bbbccccc

相反,我看到 @0x12 EC = 1110 1100 两者都不适合。

对于我的代码,我采用了 uncompress() 代码,并使用适合我的环境的分配器对其进行了轻微修改,并对窗口位(包括 15+16-MAX_WBITS 和 { {1}})。

MAX_WBITS

如何更正我对该文件的解码?

解决方法

这应该可以正常工作,假设 my_allocmy_free 做他们需要做的事情。您应该确认您实际上提供了 unzip() 您认为提供的数据。您提供的数据需要以 1f 8b 开头。

(旁注:“unzip”对于函数来说是一个糟糕的名称。它不会解压缩,因为 zip 是一种与 gzip 或 zlib 完全不同的格式。“gunzip”或“ungzip”是合适的。)>

您正在以错误的顺序手动读取 deflate 流中的位。最低有效位在前。 ec的低三位为100,表示非最后一个动态块。 0 表示非最后,然后 10 表示动态。

您可以使用 infgen 来反汇编 deflate 流。它提供的 14 个字节的输出是动态块的初始部分:

dynamic
count 286 27 16
code 0 5
code 2 7
code 3 7
code 4 5
code 5 5
code 6 4
code 7 4
code 8 2
code 9 3
code 10 2
code 11 4
code 12 4
code 16 7
code 17 7
lens 4 6 7 7 7 8 8 8 7 8
repeat 3
lens 10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。