zlib解压缩时如何保留标头和尾标

问题描述

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

我希望标题和尾部相同,但标题已更改。

48 89 EC 57 ....
  • 转换后的十六进制标题
78 9C EC BD ...

我深入zlib压缩并获得标头48也是zlib.header之一。

但是大多数78用于zlib压缩。

解压缩的是我的代码

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(第5位)

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

  • FCHECK(位0-4)

校验和(5位,0..31),其计算得出的值是整个值除以31不会得到余数。

通常情况下,只能自由更改CINFO和FLEVEL字段,并且必须根据最终值来计算FCHECK。*假设没有预设字典,则其他字段所包含的内容均无选择,因此共有32种可能标头有效。他们在这里

      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

感谢您的时间。

解决方法

我首先要注意,没关系。使用该zlib标头可以很好地将数据解压缩。你为什么在乎?

您正在向zlib.compress提供少量数据,以允许使用较小的窗口。由于允许,Python库选择使用较小的窗口进行压缩。

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