首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在zlib解压缩时保持头和尾

如何在zlib解压缩时保持头和尾
EN

Stack Overflow用户
提问于 2020-09-08 12:14:28
回答 1查看 365关注 0票数 1

我从PDF中提取原始数据,然后对原始数据进行解压缩并再次压缩。

我期望相同的标题和预告片,但标题被改变了。

  • 原始十六进制头

代码语言:javascript
复制
48 89 EC 57 ....

  • 转换十六进制头

代码语言:javascript
复制
78 9C EC BD ...

我深入研究了zlib压缩,得到了头48,它也是zlib.header的一部分。

但大多数情况下,78用于zlib压缩。

是我的代码解压缩:

代码语言:javascript
复制
decompress_wbit = 12
compress_variable = 6
output_data = zlib.decompress(open(raw_data, "rb").read(), decompress_wbit)
output_data = zlib.compress(output_data, 6)
output_file = open(raw_data + '_', "wb")
output_file.write(output_data)
output_file.close()

我改变了decompress_wbitcompress_variable,但仍然保留着78

所以不知道如何将48作为头文件。

下面是关于zlib.header的简短描述。

  • CINFO (位数12-15)

指示窗口大小为2的幂,从0(256个字节)到7 (32768字节)。这通常是7,不允许更高的值。

  • CM (位数8-11)

压缩法。只允许倾斜(8)。

  • FLEVEL (位数6-7)

大致表示压缩级别,从0(快/低)到3(慢/高)

  • FDICT (bit 5)

指示是否使用预置字典。这通常是0。1在技术上是允许的,但我不知道任何定义预设字典的Deflate格式。

  • FCHECK (位数0-4)

校验和(5位,0.. 31 ),其值的计算使得整个值除以31而没有余数。

通常,只能自由更改CINFO和FLEVEL字段,并且必须根据最终值计算FCHECK。*假定没有预置字典,在其他字段中没有选择,因此总共有32个可能的标头是有效的。下面是它们:

代码语言:javascript
复制
      FLEVEL: 0       1       2       3
CINFO:
     0      08 1D   08 5B   08 99   08 D7
     1      18 19   18 57   18 95   18 D3
     2      28 15   28 53   28 91   28 CF
     3      38 11   38 4F   38 8D   38 CB
     4      48 0D   48 4B   48 89   48 C7
     5      58 09   58 47   58 85   58 C3
     6      68 05   68 43   68 81   68 DE
     7      78 01   78 5E   78 9C   78 DA

请告诉我如何在解压缩和压缩的同时保持zlib.header

耽误您时间,实在对不起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 14:00:54

我首先要指出,这并不重要。使用那个zlib头可以很好地解压缩数据。你为什么这么在意?

您为zlib.compress提供了少量的数据,允许使用更小的窗口。由于它是允许的,Python库选择使用一个较小的窗口进行压缩。

避免这种情况的一种方法是使用zlib.compressobj。启动时,它不知道您将输入多少数据,并默认为最大的窗口大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63793703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档