问题描述
我从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_wbit
和compress_variable
,但仍然保留78
。
这是有关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
。启动后,它不知道您将要喂入多少数据,并且默认为最大窗口大小。