Есть ли способ узнать, был ли байт [] сжат gzipstream? - PullRequest
3 голосов
/ 12 января 2011

Есть ли способ узнать, сжат ли (или нет) байт [] классом GzipStream .net?

EDIT: Просто хочу знать, сжат ли массив byte [] (поскольку я всегда буду использовать GzipStream для сжатия и распаковки)

Ответы [ 3 ]

8 голосов
/ 12 января 2011

A GZipStream является DeflateStream с дополнительным заголовком и трейлером.

Формат указан в RFC 1952 .


.NET 4.0 GZipStream записывает в качестве заголовка следующие байты:

byte[] headerBytes = new byte[] { 0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0 };
if (compressionLevel == 10)
{
    headerBytes[8] = 2;
}

Трейлер состоит из контрольной суммы CRC32 и длинынесжатых данных.

3 голосов
/ 07 октября 2014

Благодаря объяснениям @ dtd, это работает для меня: (@stackoverflowuser, вы можете этого захотеть?)

public static class CompressionHelper
{
    public static byte[] GZipHeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0};
    public static byte[] GZipLevel10HeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 2, 0};

    public static bool IsPossiblyGZippedBytes(this byte[] a)
    {
        var yes = a.Length > 10;

        if (!yes)
        {
            return false;
        }

        var header = a.SubArray(0, 10);

        return header.SequenceEqual(GZipHeaderBytes) || header.SequenceEqual(GZipLevel10HeaderBytes);
    }
}
1 голос
/ 12 января 2011

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

http://www.onicos.com/staff/iz/formats/gzip.html

Вы также можете посмотреть в поле типа ОС, чтобы увидеть, было ли это FAT или NTFS, но это еще не говорит о том, что оно было написано на C # ...

...