какое наибольшее целое число без знака допустимо хранить в поле размера заголовка архива tar - PullRequest
0 голосов
/ 25 октября 2018

В спецификациях GNU для формата архива POSIX здесь структура заголовка определяется как:

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, а длина поля в байтах, по-видимому, составляет 12 байтов (вывод из комментария смещения байта).Теоретически это обеспечивает 12 байтов (= 96 бит) пространства для хранения целого числа без знака.Однако я подозреваю, что это не так.

  • Значение максимального размера равно всего 12 цифрам (999 999 999 999)?Или
  • Поскольку это значение размера представляет количество байтов в файле, означает ли это, что значение размера может быть не совсем точным, поскольку размер данных может равняться числу битов, которое не делится на 8?Или же файлы всегда сохраняются с шагом 8 бит (с неиспользованными битами, заполненными для заполнения всего байта), и, таким образом, длина данных в битах всегда будет делиться на 8?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Каждое из полей в заголовке хранится в виде строк с нулевым символом в конце.В случае размера файла он сохраняется в виде восьмеричной строки.

Таким образом, у вас есть в общей сложности 11 восьмеричных символов (оставляя место для нулевого байта), что означает 33 бита для размера файла, или до8GB.

0 голосов
/ 25 октября 2018

Согласно стандартной документации

* name, linkname, magic, uname и gname - строки символов с нулевым символом в конце,Все остальные поля являются восьмеричными восьмеричными числами в ASCII.По историческим причинам следует также использовать окончательный NUL или пробел.

Следовательно, 11 байтов дают 11 восьмеричных цифр (0..77777777777 8 или 0 ..Диапазон 0x1FFFFFFFF), который ваша программа должна преобразовать в двоичное представление таким образом, который вы считаете подходящим - например, так:

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

Demo.

...