如何在 zlib 解压缩和压缩时保留 header 和预告片
How to keep the header and trailer while zlib decompress and compress
我有从 PDF 中提取的原始数据,我将原始数据解压并再次压缩。
我期待相同的 header 和预告片,但 header 已更改。
- 原始十六进制 Header
48 89 EC 57 ....
- 转换后的十六进制 Header
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_wbit
和 compress_variable
但仍然保留 78
。
所以不确定如何将 48
设为 header。
这是关于 zlib.header 的简短描述。
- CINFO(位 12-15)
表示window大小为2的幂,从0(256字节)到7(32768字节)。这通常是 7。不允许更高的值。
- CM(8-11 位)
压缩方式。只允许放气 (8)。
- FLEVEL(位 6-7)
大致表示压缩级别,从 0 (fast/low) 到 3 (slow/high)
- FDICT(位 5)
表示是否使用预设词典。这通常是 0。1 在技术上是允许的,但我不知道定义预设词典的任何 Deflate 格式。
- FCHECK(位 0-4)
校验和(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 大小。
我有从 PDF 中提取的原始数据,我将原始数据解压并再次压缩。
我期待相同的 header 和预告片,但 header 已更改。
- 原始十六进制 Header
48 89 EC 57 ....
- 转换后的十六进制 Header
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_wbit
和 compress_variable
但仍然保留 78
。
所以不确定如何将 48
设为 header。
这是关于 zlib.header 的简短描述。
- CINFO(位 12-15)
表示window大小为2的幂,从0(256字节)到7(32768字节)。这通常是 7。不允许更高的值。
- CM(8-11 位)
压缩方式。只允许放气 (8)。
- FLEVEL(位 6-7)
大致表示压缩级别,从 0 (fast/low) 到 3 (slow/high)
- FDICT(位 5)
表示是否使用预设词典。这通常是 0。1 在技术上是允许的,但我不知道定义预设词典的任何 Deflate 格式。
- FCHECK(位 0-4)
校验和(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 大小。