Информация доступна крупицами, а вопрос большой. Так как не силён в английском - http://www.zlib.org/rfc-gzip.html мне особо не помогает.
Суть: имеется блок байтов, сжатый с помощью GZipStream. GZipStream оборачивает сжатый блок пакетом данных, в нём содержится первоначальный размер блока, размер сжатого блока и прочие типы сжатия и т.д.
Вопросы:
Эксперимент:
$ 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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, вопрос к тем, кто уже работал с платформой ASPNET Core MVC
Всем доброго времени сутокХочу вывести таблицу из бд в таблицу на странице,как можно это сделать? в то уже всю голову сломал
По адресу bdkurs/dick есть indexphp файл в котором устанавливаю куки