Я пытаюсь понять спецификацию gzip (http://www.zlib.org/rfc-gzip.html)
Особенно раздел 2, Общие соглашения:
Байты, хранящиеся в компьютере, делают не имеют «битовый порядок», так как они всегда рассматриваются как единое целое. Однако байт, рассматриваемый как целое число от 0 до 255, имеет самый старший и младший значащий бит, и, поскольку мы пишем числа с самым старшим значением di git слева, мы также пишем байты с самым старшим значащим немного слева. На приведенных ниже схемах мы пронумеровали биты байта таким образом, чтобы бит 0 был наименее значимым битом, т. Е. Биты пронумерованы:
+--------+
|76543210|
+--------+
Этот документ не касается проблема порядка, в котором биты байта передаются на последовательной битовой среде, поскольку описанный здесь формат данных ориентирован не на бит, а на байты.
В компьютере число может занимать несколько байт. Все многобайтовые числа в описанном здесь формате сначала сохраняются с младшим байтом (по нижнему адресу памяти). Например, десятичное число 520 хранится как:
0 1
+--------+--------+
|00001000|00000010|
+--------+--------+
^ ^
| |
| + more significant byte = 2 x 256
+ less significant byte = 8
У меня проблема в том, что я не уверен, как вычислить длину для заголовка FEXTRA
:
+---+---+=================================+
| XLEN |...XLEN bytes of "extra field"...| (more-->)
+---+---+=================================+
Если у меня есть одно (под) -поле со строкой длиной 1600 байт (символов), тогда моя полная длина FEXTRA
должна составлять 1600 (полезная нагрузка) + 2 (SI1 & I2, идентификатор подполя), верно?
Но байты длины установлены на 73 & 3, и я не уверен почему.
Может кто-нибудь уточнить, как я могу вычислить полную FEXTRA
длину с двумя байтами длины?
Я использую nodejs для операций с файлом .tgz / .gz.
Демонстрационный код:
РЕДАКТИРОВАТЬ 2: После прочтения снова и снова, я думаю, я понял:
if (FLAG_EXTRA) {
let len1 = bytes[10];
let len2 = bytes[11];
console.log("Extra header lenght", len1 + (len2 * 256));
}
len1 (байт 0) - это число до 256, len2 - мультипликатор для 256 .
len2 * 256
+ len1 = FEXTRA
длина заголовка.
Может кто-нибудь исправить меня, если я ошибаюсь?!
Спасибо, ребята!