有效存储在tar存档头的size字段中的最大无符号整数是多少

时间:2018-10-25 16:36:36

标签: c compression gnu tar

在POSIX tar存档格式here的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位)的空间来存储无符号整数。但是,我怀疑情况并非如此。

  • 最大大小值是否仅等于12位数字(999,999,999,999)?或者
  • 由于此大小值表示文件中的字节数,这是否意味着该大小值可能并不完全准确,因为数据大小可能等于不能被8整除的位数?还是文件总是以8位为增量保存(填充未使用的位以填充整个字节),因此位的数据长度总是可以被8整除吗?

2 个答案:

答案 0 :(得分:2)

根据standard documentation

  

namelinknamemagicunamegname是以空字符结尾的字符串。所有其他字段均为ASCII格式的零填充八进制数。   由于历史原因,还应使用最终的NUL或空格字符。

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

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

Demo.

答案 1 :(得分:0)

标头中的每个字段都存储为以空终止的字符串。如果是文件大小,则将其存储为八进制字符串。

因此,您总共有11个八进制字符(为空字节留有余地),意味着文件大小为33位,即8GB。