【发布时间】:2014-11-18 17:50:13
【问题描述】:
我一直在阅读 xz 文件格式的说明 (http://tukaani.org/xz/xz-file-format.txt)。但是当我尝试使用二进制编辑器查看 xz 文件时,它似乎不遵循描述中定义的结构。我错过了什么?
我在 linux(xz 版本 4.999.9beta)中使用 xz cli 实用程序压缩了描述文件(xz-file-format.txt),这些是我得到的前 32 个字节:
FD 37 7A 58 5A 00 00 04 E6 D6 B4 46 02 00 21 01 16 00 00 00 74 2F E5 A3 E0 A9 28 2A 99 5D 00 05
文件的整体结构应该是:流-流填充-流-等等。在这种情况下,我认为应该只有一个流,因为文件中只有一个压缩文件。流的结构是:流头 - 块 - 块 - ... - 块 - 索引 - 流尾。并且流头的结构是:header magic bytes - stream flags - crc code。
我可以从我的文件中找到流标头,但在前 16 个字节之后,它似乎不再符合描述。
上面的前六个字节显然是魔术字节。接下来的两个字节是流标志。流标志表明正在使用 CRC64,因此 CRC 代码占用接下来的 8 个字节。第十七个字节(我从一个开始数)应该是第一个块的第一个字节。
块的结构是:块头-压缩数据-块填充-校验。块头的结构应该是:块头大小 - 块标志 - 压缩大小 - 未压缩大小 - 过滤器标志列表 - 头部填充 - CRC。所以第十七字节应该是块头大小(我的文件中的 0x16)。这是可能的,但第十八个字节似乎有点奇怪。它应该是块标志位字段。在我的文件中它是空的 - 所以没有设置标志。甚至没有过滤器的数量,根据描述应该是1-4。
由于块标志的第 6 位和第 7 位也为零,因此文件中不应出现压缩和未压缩的大小,并且下一个字节应该是过滤器标志的列表。列表的结构是:过滤器 ID - 属性大小 - 过滤器属性。第十九个字节应该是过滤器ID。这在我的文件中为空,它不是任何官方定义的过滤器 ID。如果它是一个自定义 ID,它将占用 9 个字节,但据我了解,它不可能是描述第 1.2 节中描述的大小编码,因为根据描述:“除了多字节表示的最后一个字节之外的所有字节设置了最高(第八)位。”,但在我的文件中,第 20 个字节也是空的。
那么是不是有什么我不明白的地方,或者文件不符合描述?
【问题讨论】:
标签: archive binaryfiles xz