首页 > 解决方案 > 可有效存储在 tar 存档标头的大小字段中的最大无符号整数是多少

问题描述

在此处的 POSIX tar 归档格式的 GNU 规范中,标头结构定义为:

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 */
                                /* 500 */
};

标头的size字段定义为长度为 12 的 char 数组,该字段的字节长度似乎为 12 个字节(由字节偏移注释推断)。这在理论上提供了 12 个字节(=96 位)的空间来存储一个无符号整数。但是,我怀疑情况并非如此。

标签: ccompressiongnutar

解决方案


根据标准文档

, name, linkname, magic,unamegname是以空字符结尾的字符串。所有其他字段都是 ASCII 中的零填充八进制数。由于历史原因,还应使用最终的 NUL 或空格字符。

因此,11 个字节为您提供 11 个八进制数字(0..77777777777 8或 0..0x1FFFFFFFF 范围),您的程序需要以您认为合适的方式将其转换为二进制表示 - 例如,如下所示:

uint64_t size;
sscanf(header->size, "%" SCNo64 "", &size);

演示。


推荐阅读