6

byte[] がGzipStream.net クラスによって圧縮されている (または圧縮されていない) かどうかを知る方法はありますか?

編集: byte[] 配列が圧縮されているかどうかを知りたいだけです (圧縮と解凍には常に GzipStream を使用するため)

4

3 に答える 3

8

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チェックサムと非圧縮データの長さで構成されます。

于 2011-01-11T21:27:50.217 に答える
3

@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);
    }
}
于 2014-10-07T11:26:52.857 に答える
1

マジック ヘッダーの最初の数バイトを調べて、gzip 圧縮されているかどうかを確認できますが、.net 圧縮プログラムがコメントまたはその他のオプション フィールドのいずれかに追加情報を書き込まない限り、圧縮プログラムが誰であるかはおそらくわかりませ

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

OS タイプ フィールドを調べて、それが FAT か NTFS かを確認することもできますが、それでも C# によって記述されたものかどうかはわかりません...

于 2011-01-11T21:26:08.180 に答える