【问题标题】:Python generated lzma file with missing uncompressed sizePython 生成的 lzma 文件缺少未压缩的大小
【发布时间】:2022-02-18 22:32:11
【问题描述】:

根据https://svn.python.org/projects/external/xz-5.0.3/doc/lzma-file-format.txt

lzma 标头应如下所示 1.1。标题

+------------+----+----+----+----+--+--+--+--+--+--+--+--+
| Properties |  Dictionary Size  |   Uncompressed Size   |
+------------+----+----+----+----+--+--+--+--+--+--+--+--+

我尝试使用以下方法生成 16kb *.bin 文件的 lzma 文件:

1.) 7z标准SDK给出的lzma.exe(带-d23参数,2^23 dict大小),然后

2.) 尝试使用以下代码在 python 中生成

import lzma

fileName = "file_split0_test.bin"
testFileName = "file_split0_test.lzma"
lzma_machine = lzma.LZMACompressor(format=lzma.FORMAT_ALONE)

with open(fileName, "rb") as fileRead:
    toWrite = b""
    byteRead = fileRead.read()

    data_out = lzma_machine.compress(byteRead)

    #print(data_out.hex())
    fs = open(testFileName, 'wb')
    fs.write(data_out)
    fs.close()

fileRead.close()

但是,尽管我使用相同的“属性”5d 和字典大小 0x8000,但两者的结果是不同的。我可以看到,python 生成的 lzma 文件的输出为“未压缩大小”字段生成了所有 0xFF,这与使用 lzma.exe 生成的不同

希望哪位专家能在这里指出我的错误?

lzma.exe 生成文件

python lzma 生成文件

【问题讨论】:

    标签: python header lzma pylzma


    【解决方案1】:

    我遇到了和你一样的问题,现在我可以说,你可能没有犯任何错误。看起来现代 lzma 实现不会在标头中添加未压缩大小的值。他们使用简单的“未知大小”,即 -1 的值,这对于现代 lzma 解压缩器来说已经足够了。但是,如果您需要在标头中有 uncompressed size 的值,只需替换那些二进制数据:

    uncompressed_size = len(byteRead)
    data_out = data_out[:5] + uncompressed_size.to_bytes(8, 'little') + data_out[13:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多