Сжатие Deflate(GZIP)

257
15 марта 2017, 15:36

Информация доступна крупицами, а вопрос большой. Так как не силён в английском - http://www.zlib.org/rfc-gzip.html мне особо не помогает.

Суть: имеется блок байтов, сжатый с помощью GZipStream. GZipStream оборачивает сжатый блок пакетом данных, в нём содержится первоначальный размер блока, размер сжатого блока и прочие типы сжатия и т.д.

Вопросы:

  1. Как правильно получить размеры блока: сжатый и исходный?
  2. Если сжимать и распаковывать блоки с помощью GZipStream - мне не нужно обрезать обёртку (байты с обоих сторон), это сделает за меня gZipStream?
Answer 1

Эксперимент:

$ echo -ne "Hello, " > file1.txt
$ echo "World!" > file2.txt
$ gzip file1.txt
$ gzip file2.txt
$ cat file1.txt.gz file2.txt.gz > file3.txt.gz
$ gzip -d file3.txt.gz
$ cat file3.txt
Hello, World!
$ 

Источник: http://www.zlib.org/rfc-gzip.html#file-format

Файл gzip состоит из серии "членов" (сжатых наборов данных). Формат каждого члена указан далее. Члены просто идут один за другим в файле, без дополнительной информации до, между или после них.

К сожалению, именно на C# не могу это сделать, так как не знаю этого языка.

Можно просто разобрать gzip-файл по байтам и посмотреть. Экспериментальный файл делается командой в шелл:

echo -n "hello" | gzip -n > test.txt.gz

Флаг -n у echo значит не добавлять перенос в конце строки, у gzip он значит не вставлять в заголовки имя и дату модификации исходного файла. Для простоты. Сжимаем строку "hello" Получается следующий файл (test.txt.gz):

Первые два байта это ID1 и ID2 из RFC. Третий (00001000 = 8) это метод компрессии CM (всегда 8, то есть deflate). Четвертый это флаги FLG. Я выделил один флаг зеленым. Если его установить в 1, то это будет значить, что используются дополнительные заголовки. За байтом флагов идут четыре нулевых байта. Это время последней модификации исходного файла MTIME. Оно нулевое из-за флага -n. Следующий байт это дополнительные флаги XFL и за ним выделен красным тип операционной системы OS (00000011 = 3, то есть Unix). Вот за этим полем пойдут дополнительные заголовки, если установить нужный бит во флагах. Сейчас же за ним идут сжатые данные, длину которых можно определить, только выполнив декомпрессию, после которых четыре байта CRC32 и только в конце четыре байта ISIZE (выделил синим). То есть ISIZE не находится в заголовке и его позицию нельзя узнать без декомпрессии. У вас остается только вариант использовать экстра-заголовки и вместо ISIZE, и для хранения длины сжатых данных, известной на этапе компрессии, если вы хотите чтобы архив оставался валидным gzip.

READ ALSO
Готов ли ASP.NET Core MVC для продакшена?

Готов ли ASP.NET Core MVC для продакшена?

Здравствуйте, вопрос к тем, кто уже работал с платформой ASPNET Core MVC

319
Как очистить IEnumerable

Как очистить IEnumerable

Здравствуйте!

252
Как вывести таблицу из БД?

Как вывести таблицу из БД?

Всем доброго времени сутокХочу вывести таблицу из бд в таблицу на странице,как можно это сделать? в то уже всю голову сломал

279
Установка куки для других сайтов

Установка куки для других сайтов

По адресу bdkurs/dick есть indexphp файл в котором устанавливаю куки

222