понимание: порядок байтов в спецификации протокола (gzip) - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь понять спецификацию 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 длина заголовка.

Может кто-нибудь исправить меня, если я ошибаюсь?!

Спасибо, ребята!

...