Compression TAR文件格式问题

Compression TAR文件格式问题,compression,zip,gzip,tar,bzip2,Compression,Zip,Gzip,Tar,Bzip2,我不清楚什么是正确的.tar文件格式,因为我在三种情况下体验到了正确的功能(见下文) 根据我一直使用的.tar规范,magic字段(ustar)是以null结尾的字符串,version字段是八进制数,没有尾随的null 然而,我检查了在服务器上找到的几个.tar文件,发现magic和version字段的不同实现,这三个字段似乎都工作正常,可能是因为系统忽略了这些字段 请参见以下示例中单词ustar和root之间的不同(3)字节>> 情景1(20 20 00): 场景2(0020): 场景3(00

我不清楚什么是正确的
.tar
文件格式,因为我在三种情况下体验到了正确的功能(见下文)

根据我一直使用的
.tar
规范,
magic
字段(ustar)是以null结尾的字符串,
version
字段是八进制数,没有尾随的null

然而,我检查了在服务器上找到的几个
.tar
文件,发现
magic
version
字段的不同实现,这三个字段似乎都工作正常,可能是因为系统忽略了这些字段

请参见以下示例中单词ustarroot之间的不同(3)字节>>

情景1(
20 20 00
):

场景2(
0020
):

场景3(
00
):


哪一种格式正确?

在我看来,您的示例都不正确,至少POSIX格式不正确。
正如你所看到的:

第一个示例(
场景1
)的格式似乎与旧的GNU头格式相匹配:

/* OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
   Found in an archive, it indicates an old GNU header format, which will be
   hopefully become obsolescent.  With OLDGNU_MAGIC, uname and gname are
   valid, though the header is not truly POSIX conforming */

#define OLDGNU_MAGIC "ustar  "  /* 7 chars and a null */

在第二个和第三个示例(
场景2
场景3
)中,
版本
字段设置为意外值(根据上述文档,正确的值应为
00
ASCII或
0x30 0x30
hex),因此,此字段很可能被忽略。

如果我执行此命令,则使用Fedora 18:

tar --format=posix -cvf testPOSIX.tar test.txt
我有一个POSIX tar文件格式:ustar\0(0x757374617200)

否则,如果我执行此操作:

tar --format=gnu -cvf testGNU.tar test.txt
我有一个GNU tar文件格式:ustar 0x20 0x20 0x00(0x7573746172202000)(旧GNU格式)

从/usr/share/magic文件:

# POSIX tar archives
257 string      ustar\0     POSIX tar archive
!:mime  application/x-tar # encoding: posix
257 string      ustar\040\040\0 GNU tar archive
!:mime  application/x-tar # encoding: gnu
0x20是八进制的40

我还尝试使用以下命令编辑十六进制代码:

00 20 20
00 00 00
然而,焦油工作正常。我已经没有问题了extract test.txt

但当我试图用以下命令编辑十六进制代码时:

00 20 20
00 00 00
焦油没有被认出来

因此,我的结论是正确的格式是:

20 20 00

试着在你的头上制作一些
.tar
文件,然后用hex viewer检查该文件,你会在它的头中看到
ustar00
。我也希望如此,但我在我检查的几个文件中都没有找到,所以。。?!我在Centos 5.9系统上进行了两次测试,发现默认情况下输出文件包含“ustar”,因为TAR命令是GNU版本。如果我指定
--posix
选项,输出文件将按预期包含“ustar00”。进一步参考:CentOS 6对
00
没有问题,根据posix,正确的魔术是“ustar\0”,然后是“00”,其中
“ustar\0”
是魔术,
“00”
是版本。
00 00 00
20 20 00