是.xz文件格式描述告诉所有吗?

时间:2014-11-18 17:50:13

标签: archive binaryfiles xz

我一直在阅读xz文件格式(http://tukaani.org/xz/xz-file-format.txt)的说明。但是当我尝试使用二进制编辑器查看xz文件时,它似乎并不遵循描述中定义的结构。我错过了什么?

我用linux中的xz cli实用程序压缩了描述文件(xz-file-format.txt)(xz版本4.999.9beta),这些是我得到的前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

文件的整体结构应该是:stream - stream padding - stream - 等等。在这种情况下,我认为应该只有一个流,因为文件中只压缩了一个文件。流的结构是:流头 - 块 - 块 - ... - 块 - 索引 - 流页脚。并且流标头的结构是:标头魔术字节 - 流标志 - crc代码。

我可以从我的文件中找到流标题,但在前16个字节后,它似乎不再符合描述了。

上面的前六个字节显然是神奇的字节。接下来的两个字节是流标志。流标志表示正在使用CRC64,因此CRC代码接下来的八个字节。第十七个字节(我从一个计数)应该是第一个块的第一个字节。

块的结构是:块头 - 压缩数据 - 块填充 - 检查。块头的结构应该是:块头大小 - 块标志 - 压缩大小 - 未压缩大小 - 过滤器标志列表 - 头填充 - CRC。所以第十七个字节应该是块头大小(在我的文件中为0x16)。这是可能的,但第十八个字节似乎有点奇怪。它应该是块标志位字段。在我的文件中它为空 - 所以没有设置标志。甚至没有过滤器的数量,根据描述应该是1-4。

由于块标志的第6位和第7位也是零,因此压缩和未压缩的大小不应出现在文件中,下一个字节应该是过滤器标志列表。列表的结构是:过滤器ID - 属性的大小 - 过滤器属性。然后第十九个字节应该是过滤器ID。这在我的文件中为空,这不是任何官方定义的过滤器ID。如果它是一个自定义ID,它将需要九个字节,但据我所知,描述的第1.2节中描述的尺寸编码是不可能的,因为根据描述:"除了最后一个多字节表示的字节具有最高(第八)位设置。",但在我的文件中,第二十个字节也为空。

那么有什么我不明白或者文件没有​​遵循描述吗?

1 个答案:

答案 0 :(得分:1)

我匆匆地问了一下这个问题,并自己想出了一个解决方案。为了防止有人感兴趣,我会回答我自己的问题。

我误解了流标题中流标记的含义。它们不会影响标头中的CRC代码(始终是CRC32),只是流本身的CRC(如名称流标志所暗示的)。这意味着报头中的CRC只有4个字节长,因此字节13-24形成有效的块报头。

在块头中,块标志字段又是一个空字节,我之前看到它是一个问题。根据描述,滤波器的数量应该在1和4之间。所以我期望十进制值至少为1。由于滤波器的数量用两位表示,最大十进制值为3,但可能值的数量(包括零)当然是4,因此零意味着一个滤波器。

由于块标志的最后两位也是零,因此块头中不存在压缩大小或未压缩大小字段。这意味着字节15-17是第一个(也是唯一的)过滤器的过滤器标志。过滤器ID 0x21是LZMA2过滤器的ID。属性大小0x01表示一个字节的大小。字典大小0x16表示大小为4096 KiB。