4

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

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

但是,我查看了.tar在我的服务器上找到的几个文件,发现magicandversion字段的不同实现,它们三个似乎都可以正常工作,可能是因为系统忽略了这些字段。

在以下示例中查看单词ustarroot之间的不同 (3) 个字节>>

情景 1 ( 20 20 00):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 20 20      .....ustar  
 00000108      00 72 6F 6F | 74 00 00 00 | 00 00 00 00      .root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

情景 2 ( 00 20 20):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 00 20      .....ustar. 
 00000108      20 72 6F 6F | 74 00 00 00 | 00 00 00 00      root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

情景 3 ( 00 00 00):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 00 00      .....ustar..
 00000108      00 72 6F 6F | 74 00 00 00 | 00 00 00 00      .root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

哪一个是正确的格式?

4

2 回答 2

6

在我看来,您的示例都不是正确的,至少对于 POSIX 格式不是。
你可以在这里阅读:

/* tar Header Block, from POSIX 1003.1-1990. */
/* POSIX header */

struct posix_header {   /* byte offset */
  char name[100];               /*   0 */
  char mode[8];                 /* 100 */
  char uid[8];                  /* 108 */
  char gid[8];                  /* 116 */
  char size[12];                /* 124 */
  char mtime[12];               /* 136 */
  char chksum[8];               /* 148 */
  char typeflag;                /* 156 */
  char linkname[100];           /* 157 */
  char magic[6];                /* 257 */
  char version[2];              /* 263 */
  char uname[32];               /* 265 */
  char gname[32];               /* 297 */
  char devmajor[8];             /* 329 */
  char devminor[8];             /* 337 */
  char prefix[155];             /* 345 */
};

#define TMAGIC   "ustar"        /* ustar and a null */
#define TMAGLEN  6
#define TVERSION "00"           /* 00 and no null */
#define TVERSLEN 2

您的第一个示例 ( Scenario 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 */

在您的第二个和第三个示例(Scenario 2Scenario 3)中,该version字段设置为意外值(根据上述文档,正确的值应该是00ASCII 或0x30 0x30十六进制),因此该字段很可能被忽略。

于 2013-10-14T20:07:23.287 回答
1

如果我执行以下命令,则使用 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

但是焦油工作正常。我已经提取 test.txt 没有问题。

但是当我尝试使用以下方法编辑十六进制代码时:

00 00 00

焦油未被识别。

所以,我的结论是正确的格式是:

20 20 00
于 2013-10-18T12:53:13.663 回答