Надежен ли заголовок GZipStream в версиях.NET?

Я пришел к ответам на вопросы. Есть ли способ узнать, был ли сжат байтом [] gzipstream? а некоторые автор утверждает (и это правда), что GZipStream путы {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0} символы в качестве заголовка, чтобы знать, является ли байтовый массив сжатой строкой.

И мой вопрос, является ли заголовок GZipStream надежным в версиях.NET?

3 ответа

Решение

С любым потоком формата GZip вы гарантированы:

Первые два байта: 1f, 8b

Следующий байт: 00 для магазина (без сжатия), 01 для алгоритма сжатия, 02 для упаковки, 03 для LZF и 08 для дефлята. Пока что.NET всегда использует deflate, и во многих ситуациях ожидается только deflate (веб-клиенты ожидают только gzip на основе deflate в качестве кодировки передачи или содержимого, помеченной как gzip) поэтому вряд ли это изменится без какой-либо опции, чтобы указать, что он добавляется.

Следующий тип файла, с 00 что означает "вероятно, какой-то текстовый файл", так как GZipStream не имеет информации о типе файла, он всегда использует это.

Следующие четыре - время модификации файла в формате Unix. Опять же, поскольку у класса нет информации о файле - поскольку он получает поток, а не файл с метаданными, для них всегда устанавливается значение 0.

Следующий байт зависит от метода сжатия. С deflate возможно 2 для обозначения сильного сжатия или 4 чтобы указать легкое сжатие.

Следующий (последний в вашей последовательности) зависит от типа используемой ОС. 0 означает "Файловая система FAT", но продолжает использоваться Windows, поскольку Windows перешла на использование других файловых систем, таких как NTFS. Он может иметь другое значение, если его использовать с Mono в файловой системе, отличной от Windows, хотя эта ситуация также может решить, что он соответствует поведению.NET. (Обновление: по крайней мере, в некоторых версиях Mono флаг файловой системы будет установлен не на 0 в системах, отличных от Windows).

Он должен быть надежным, потому что этот заголовок взят из спецификации GZip и, следовательно, не специфичен для.NET. Смотрите здесь для объяснения этих значений.

Однако, согласно спецификации, только два первых байта фактически всегда одинаковы. Третий байт практически всегда одинаков, поскольку в настоящее время существует только одно допустимое значение. Следующие байты могут измениться.

Поток gzip гарантированно начинается с 0x1f 0x8b 0x08, Не поддерживается никакой другой метод сжатия, кроме 0x08 в третьем байте.

Так что если вы не видите 0x1f 0x8b 0x08 тогда это не поток gzip. Однако, если вы видите 0x1f 0x8b 0x08, тогда это может быть или не быть потоком gzip. Возможно, это так, но вы не можете этого допустить.

Что вы должны сделать с файлом gzip кандидата, это просто начать распаковывать его как таковой. Декодер немедленно распознает, если заголовок gzip отсутствует, и, кроме того, вскоре обнаружит проблему в сжатых данных, если есть случайный заголовок gzip. Вам не нужно проверять заголовок, поскольку декодер уже делает это, а также проверять правильные сжатые данные после этого.

Другие вопросы по тегам