从字节字符串压缩/解压缩数据

时间:2019-08-28 09:39:24

标签: python-3.x string byte gzip deflate

我有一个二进制文件,没有扩展名(只是文件名)。它包含几个图像。 xml标头包含有关每个图像或图像堆栈的一些信息。

例如,第一堆图像具有诸如totalBytes=7029545compress=Deflated之类的信息。但是,其他堆栈包含compress=None,我设法毫无问题地读取它们。

但是,首先,根据我的理解,除非解压缩“数据”,否则我无法阅读它们。第一个堆栈中的数据存储在“字符串”中,该字符串属于类别“ bytes”(源自type( my_first_stack_data ))。

我尝试了几种方法来解压缩zlib,gzip,lzma中的数据。但是没有办法。我什至尝试对所有可能的wbits值(从-15到48)使用zlib ...

数据的开头看起来像这样(from my_first_stack_data[:100]):

b'\x00x\x9c\xec\xbdu\xdcW\xc5\x13?:3\x1b\xe7\xd3\xf1t\xc2CwwwHKJIwHw#JK\x87\x94\x88t\xa3\xa4 \x88  \x88 \x824JI\xa7\x02\xa2\xe2\xdd=\x9f\xcf\x13\xa2\xde\xfb\xba\x7f\xfc|\xbe\x97s\xc7\xd7sj\xf7\x1c?\xfbffgvvv\x16\xe0\x7f\x93H\xfdE\xc1ZxS\x9d+@w\xf3\x19\x9a'

例如,gzip.decompress方法给了我一个例外:OSError: Not a gzipped file (b'\x00x')

如何读取/解压缩该“字节”字符串(而不是成功读取包含未压缩数据的整个文件)?非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为您的数据缺少指定压缩方法的三个字节的GZIP标头。根据我的测试,您可能很幸运地添加了前缀'\x1F\x8B\x08',然后将其传递给gzip.decompress()

使用您提供的缩短的数据,这仍然会导致zlib.error消息Error -3 while decompressing data: invalid block type的异常,但这也许是缩短的结果,如果您使用原始数据,则可能会起作用。 / p>

import gzip

decompressed = gzip.decompress(bytes([ 0x1F, 0x8B, 0x08 ]) + original_bytes)