我有一个二进制文件,没有扩展名(只是文件名)。它包含几个图像。 xml标头包含有关每个图像或图像堆栈的一些信息。
例如,第一堆图像具有诸如totalBytes=7029545
和compress=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')
如何读取/解压缩该“字节”字符串(而不是成功读取包含未压缩数据的整个文件)?非常感谢。
答案 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)