python - Python 生成的 lzma 文件缺少未压缩的大小
问题描述
根据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生成文件
解决方案
我遇到了和你一样的问题,现在我可以说,你可能没有犯任何错误。看起来现代 lzma 实现不会在标头中添加未压缩大小的值。他们使用简单的“未知大小”,即 -1 的值,这对于现代 lzma 解压缩器来说已经足够了。但是,如果您需要在标头中包含 uncompressed size 的值,只需替换那些二进制数据:
uncompressed_size = len(byteRead)
data_out = data_out[:5] + uncompressed_size.to_bytes(8, 'little') + data_out[13:]
推荐阅读
- dynamics-365 - 表单 > 计划任务 - 仅需要 1 个时添加到所有存储桶
- r - ggfority::autoplot 残差图很小
- docker - 如何从服务器设计可扩展的客户端容器化
- php - 带有 xdebug 的 PHpUnit 在 BaseTestRunner 中断而不是实际测试
- python - 为模糊逻辑关系组在 pandas 中分组数据
- c# - 通过脚本更改相机渲染器数据
- c++ - cpp排序中的比较器
- python - 在 Pandas 中按多列填充缺失的年份 groupy 并按顺序水平显示多列
- laravel - 有没有办法用 belongsToMany 构建 hasManyTrough?
- c++ - 从 COM 对象执行函数期间“无响应”