6

GzipStream有没有办法知道 byte[] 是否已被.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

您可以查看魔术头的前几个字节以查看它是否已压缩,但除非 .net 压缩器将其他信息写入评论或其他可选字段之一,否则您可能无法分辨压缩器是谁。

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

您还可以查看操作系统类型字段以查看它是 FAT 还是 NTFS,但这仍然不能告诉您它是由 C# 编写的...

于 2011-01-11T21:26:08.180 回答