如何在 zlib 解压缩和压缩时保留 header 和预告片

How to keep the header and trailer while zlib decompress and compress

我有从 PDF 中提取的原始数据,我将原始数据解压并再次压缩。

我期待相同的 header 和预告片,但 header 已更改。

48 89 EC 57 ....
78 9C EC BD ...

我研究了 zlib 压缩并得到 header 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 设为 header。

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

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

压缩方式。只允许放气 (8)。

大致表示压缩级别,从 0 (fast/low) 到 3 (slow/high)

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

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

一般情况下,只有CINFO和FLEVEL字段可以自由更改,FCHECK必须根据最终值计算。*假设没有预设字典,其他字段包含的内容没有选择,所以一共32 个可能的 header 是有效的。他们在这里:

      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 header 可以很好地解压缩数据。你为什么关心?

您正在提供 zlib.compress 允许较小 window 的少量数据。由于允许,Python 库选择使用较小的 window.

进行压缩

避免这种情况的一种方法是改用 zlib.compressobj。启动时,它不知道您将为其提供多少数据,并且会默认为最大 window 大小。