【问题标题】:Gzipstream header and suffixGzipstream 标头和后缀
【发布时间】:2016-11-20 22:37:06
【问题描述】:

我如何知道我使用的 GzipStream 压缩文件的大小?我知道它有一个标题和后缀。前 10 个字节 - 它是标题,后 8 个字节 - 后缀。怎么知道后缀文件的大小?

【问题讨论】:

  • 这是不言而喻的,但我还是会说,因为没有一个答案可以:最后 4 个字节是原始长度 MOD 2^32。

标签: c# .net filestream gzipstream


【解决方案1】:

写得更好一点:

public int GetUncompressedSize(string FileName)
{
   using(BinaryReader br = new BinaryReader(File.OpenRead(pathToFile))
   {
        br.BaseStream.Seek(SeekOrigin.End, -4);
        return br.ReadInt32();
   }
}

【讨论】:

    【解决方案2】:

    我看到您很可能对我之前的答案投了反对票,因为它是一个使用 Java 的示例。原理还是一样的,所以你的问题的答案是最后 4 个字节包含你需要的信息。希望这个答案更符合您的要求。

    这是一个C#Decompress函数示例,解压GZip,包括获取GZipStream使用的压缩文件的大小:

    static public byte[] Decompress(byte[] b)
    {
        MemoryStream ms = new MemoryStream(b.length);
        ms.Write(b, 0, b.Length);
        //last 4 bytes of GZipStream = length of decompressed data
        ms.Seek(-4, SeekOrigin.Current);
        byte[] lb = new byte[4];
        ms.Read(lb, 0, 4);
        int len = BitConverter.ToInt32(lb, 0);
        ms.Seek(0, SeekOrigin.Begin);
        byte[] ob = new byte[len];
        GZipStream zs = new GZipStream(ms, CompressionMode.Decompress);
        zs.Read(ob, 0, len);
        returen ob;
    }
    

    【讨论】:

    • 它是 Java,而不是 C#。在某些情况下,C# 和 Java 可能非常相似,并且可以接受使用 c# 或 c# 使用 java 来回答 java,但在这种情况下,代码完全不同。
    • 如果您编辑您的答案并将其他回复放在此我将删除反对票,除非您修改答案,否则我无法删除,S.O.不允许。
    • 嗨@gusman 我已经按照你的要求编辑了我的帖子,以消除向下咬伤(尽管这是 3 年前,哈哈)
    【解决方案3】:

    我看到您很可能对我之前的答案投了反对票,因为它是一个使用 Java 的示例。原理还是一样的,所以你的问题的答案是最后 4 个字节包含你需要的信息。希望这个答案更符合您的要求。

    这是一个C#Decompress函数示例,解压GZip,包括获取GZipStream使用的压缩文件的大小:

    static public byte[] Decompress(byte[] b)
    {
        MemoryStream ms = new MemoryStream(b.length);
        ms.Write(b, 0, b.Length);
        //last 4 bytes of GZipStream = length of decompressed data
        ms.Seek(-4, SeekOrigin.Current);
        byte[] lb = new byte[4];
        ms.Read(lb, 0, 4);
        int len = BitConverter.ToInt32(lb, 0);
        ms.Seek(0, SeekOrigin.Begin);
        byte[] ob = new byte[len];
        GZipStream zs = new GZipStream(ms, CompressionMode.Decompress);
        zs.Read(ob, 0, len);
        returen ob;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      相关资源
      最近更新 更多