【问题标题】:Deflate/Unzip data from byte string从字节字符串中压缩/解压缩数据
【发布时间】:2019-08-28 09:39:24
【问题描述】:

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

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

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

我尝试了几种方法来解压缩数据,包括 zlib、gzip、lzma。但没有一个有效。我什至尝试使用 zlib 获取所有可能的 wbits 值(从 -15 到 48)...

数据的开头是这样的(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')

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

【问题讨论】:

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


    【解决方案1】:

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

    使用您提供的缩短数据,这仍然会导致 zlib.error 异常并显示消息 Error -3 while decompressing data: invalid block type,但这可能是缩短的影响,如果您改用原始数据,它可能会起作用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多