【问题标题】:Is there a way to know if the byte[] has been compressed by gzipstream?有没有办法知道 byte[] 是否已被 gzipstream 压缩?
【发布时间】:2011-06-07 11:06:35
【问题描述】:

有没有办法知道 byte[] 是否被GzipStream .net 类压缩(或没有)?

编辑: 只想知道 byte[] 数组是否被压缩(因为我会一直使用 GzipStream 来压缩和解压)

【问题讨论】:

  • 你从哪里得到字节[]?
  • @Mark:来自 WCF 运行时。它实际上是 ArraySegment

标签: c# c#-4.0 compression gzipstream


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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校验和和未压缩数据的长度组成。

    【讨论】:

    • 谢谢。 compressionLevel 是从哪里来的?另外我只想知道 byte[] 是否已被压缩(gzipstream 或 deflatestream 无关紧要,因为我总是使用 GzipStream。我想我需要重新表述我的问题)。
    • @stackoverflowuser:如果字节没有像 GZipStream 这样的标头,则无法可靠地确定随机字节序列是否代表压缩数据。
    • 感谢您的解释。抱歉,但我仍然无法使用他的代码 sn-p。我有一个 byte[],上面的代码 sn-p 似乎正在使用 compressionLevel (??) 设置 headerBytes。你能请。考虑到 byte[] 的输入,更新代码 sn-p
    【解决方案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);
        }
    }
    

    【讨论】:

    • 你如何使用这个助手?帮什么忙?
    • 助手只是一个静态类,您可以在任何地方使用它,而无需先实例化对象。我在 Http Modules 的响应管道中使用它:CompressHelper.IsPossiblyGZippedBytes(responseStream);
    • 它在 .net 3.5 和 4.5 中按预期工作,尽管我必须实现 SubArray 方法。有关如何实现 SubArray 方法的更多信息?请参阅以下链接:stackoverflow.com/questions/943635/…
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多