我不清楚,正确的.tar
文件格式是什么,因为我在使用三种方案时遇到了正确的功能(见下文)。
根据我一直在使用的.tar
规范,magic
字段(ustar)是以空值终止的字符串,version
字段是八进制数,没有尾随空值。
但是我已经查看了我在服务器上找到的几个.tar
文件,我发现了magic
和version
字段的不同实现,并且所有这三个文件似乎都正常工作,可能是因为系统忽略这些字段。
在以下示例>>
中查看单词 ustar 和 root 之间的不同(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 ............
哪一种格式正确?
答案 0 :(得分:5)
在我看来,没有一个例子是正确的,至少不适用于POSIX格式 正如您可以阅读here:
/* 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 2
和Scenario 3
)中,version
字段设置为意外值(根据上述文档,正确的值应为{ {1}} ASCII或00
十六进制),因此该字段很可能被忽略。
答案 1 :(得分: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
然而tar工作正常。我没有问题地将test.txt exctract。
但是当我尝试使用以下代码编辑十六进制代码时
00 00 00
焦油未被识别。
所以,我的结论是正确的格式是:
20 20 00