zlib раздувается без контрольной суммы DICTID и ADLER32 nodejs

я пытаюсь раздуть буфер с помощью модуля zlib в NodeJs. У меня была проблема, что я всегда получал ошибку «неожиданный конец файла», поэтому я использовал свои исходные данные и позволял nodejs сдувать их, чтобы сравнить значения байтов.

(1) Итак, это значение, которое у меня есть:

120, 156, 106, 46, 97, 96, 96, 96, 73, 97, 96, 76, 1, 49, 152, 82, 24, 216, 226, 75, 138, 18, 147, 83, 115, 128, 60, 198, 92, 32, 161, 17, 173, 148, 158, 88, 146, 90, 158, 88, 169, 91, 80, 148, 162, 155, 155, 152, 153, 167, 91, 104, 96, 94, 172, 164, 83, 173, 148, 155, 153, 92, 148, 95, 172, 100, 101, 160, 103, 80, 27, 155, 149, 194, 32, 148, 145, 154, 88, 84, 146, 148, 154, 88, 18, 159, 153, 87, 146, 90, 84, 150, 152, 147, 196, 192, 176, 80, 41, 133, 129, 41, 191, 32, 145, 11, 104, 75, 113, 10, 3, 115, 94, 102, 14, 144, 85, 2, 97, 1, 0, 0, 0, 255, 255

(2) Вот что дал мне zlib.deflateSync:

120, 156, 1, 125, 0, 130, 255, 120, 156, 106, 46, 97, 96, 96, 96, 73, 97, 96, 76, 1, 49, 152, 82, 24, 216, 226, 75, 138, 18, 147, 83, 115, 128, 60, 198, 92, 32, 161, 17, 173, 148, 158, 88, 146, 90, 158, 88, 169, 91, 80, 148, 162, 155, 155, 152, 153, 167, 91, 104, 96, 94, 172, 164, 83, 173, 148, 155, 153, 92, 148, 95, 172, 100, 101, 160, 103, 80, 27, 155, 149, 194, 32, 148, 145, 154, 88, 84, 146, 148, 154, 88, 18, 159, 153, 87, 146, 90, 84, 150, 152, 147, 196, 192, 176, 80, 41, 133, 129, 41, 191, 32, 145, 11, 104, 75, 113, 10, 3, 115, 94, 102, 14, 144, 85, 2, 97, 1, 0, 0, 0, 255, 255, 164, 112, 54, 45, (жирный шрифт = то же)

Насколько я могу судить из RFC, первые два байта - это метод сжатия и флаги. и поэтому оба имеют его. Другая часть, выделенная жирным шрифтом, — это сжатые данные. Все идет нормально.

Первая часть, которая не совпадает, — это часть DICTID. Но, согласно RFC, это всего четыре байта, так что же представляют собой остальные три байта (255, 120, 156)? Последняя часть, не выделенная жирным шрифтом, — это контрольная сумма ADLER32 сжатых данных.

Вопрос: может ли zlib (nodejs) каким-то образом увеличивать данные без контрольной суммы DICTID и ADLER32?

Текущий фрагмент кода:

const data = /* Array from (1) */;
const buffer = Buffer.from(data);
const out = zlib.inflateSync(buffer);

Вывод: Error: unexpected end of file

Предыстория. В конечном счете я пытаюсь сделать следующее, но в javascript вместо python.

Примечание. Программа командной строки zlib-flate каким-то образом может увеличивать байты из (1), поэтому я предполагаю, что делаю что-то не так.


person Nimmi    schedule 16.04.2020    source источник


Ответы (1)


После нескольких часов проб и ошибок я наконец понял, в чем проблема. Чтобы иметь возможность раздувать байты из (1), вы должны установить опцию finishFlush:

const result = zlib.inflateSync(buffer, {finishFlush: zlib.constants.Z_SYNC_FLUSH});
person Nimmi    schedule 17.04.2020