Реализовать декомпрессию GZIP с помощью алгоритма deflate - PullRequest
0 голосов
/ 04 марта 2020

Мне нужно распаковать данные gzip или deflate в кодировке Base64 из JavaScript, не добавляя много к размеру пакета (поэтому я не могу просто использовать pako). Я нашел хорошую маленькую библиотеку для распаковки deflate данных, которая называется UZIP.

Похоже, что gzip это просто deflate с 10-байтовым заголовком и 8 байт нижний колонтитул Гарантируется, что данные не будут повреждены и не будут иметь никаких дополнительных заголовков, кроме этих десяти байтов. Имея все это в виду, я предположил, что мог бы просто Base64 декодировать данные, преобразовать их в Uint8Array и вырезать верхний и нижний колонтитулы.

const data = // some Base64-encoded, gzipped string
const dataBytes = new Uint8Array(atob(data).split('').map(char => char.charCodeAt(0)));
const decompressed = UZIP.inflate(dataBytes.slice(10, -8));

Этот код зависает бесконечно (предположительно потому, что UZIP имеет плохую обработку ошибок). Я пытался использовать pako и zlib на обоих Node.js и в браузере, но оба жаловались на неверный заголовок. Для справки: используя zlib.gunzip после декодирования из Base64, а также запуская pako.inflate (который автоматически определяет тип сжатия), оба правильно распаковывают сжатые данные.

Можно ли извлечь необработанные deflate данные из строки gzip? Если нет, то существуют ли легкие библиотеки, которые могут распаковывать gzip и deflate?

1 Ответ

1 голос
/ 04 марта 2020

Я обнаружил, что deflate spe c не включает заголовки, но zlib включает, и многие библиотеки вызывают zlib декомпрессию inflate, при этом вызывая истинную инфляцию inflateRaw. Я изменил свои вызовы методов с inflate на inflateRaw, и он сразу сработал.

...