C# gzip流头和后缀

C# gzip流头和后缀,c#,.net,filestream,gzipstream,C#,.net,Filestream,Gzipstream,如何知道使用GzipStream的压缩文件的大小?我知道它有一个标题和后缀。前10个字节是头,后8个字节是后缀。我如何知道后缀中的大小文件?我发现您很可能否决了我之前的答案,因为这是一个使用Java的示例。原理仍然是一样的,所以您的问题的答案是最后4个字节包含您需要的信息。希望这个答案更符合你的要求 以下是解压缩GZip的C#解压缩函数示例,包括获取GZipStream使用的压缩文件的大小: static public byte[] Decompress(byte[] b) { Memo

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

我发现您很可能否决了我之前的答案,因为这是一个使用Java的示例。原理仍然是一样的,所以您的问题的答案是最后4个字节包含您需要的信息。希望这个答案更符合你的要求

以下是解压缩GZip的C#
解压缩
函数示例,包括获取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;
}
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的例子。原理仍然是一样的,所以您的问题的答案是最后4个字节包含您需要的信息。希望这个答案更符合你的要求

以下是解压缩GZip的C#
解压缩
函数示例,包括获取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;
}
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;
}

写得好一点的东西:

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

它是Java,不是C。在某些情况下,C#和Java非常相似,可以接受用C#回答Java,或者用Java回答C#,但在这种情况下,代码完全不同。如果您编辑您的答案并将另一个答案放在这里,我将删除反对票,除非您修改答案,否则我无法删除,S.O.不允许。Hi@gusman我已经按照你的要求编辑了我的帖子,以删除下边的内容(尽管这是3年前的事了,lol)。不用说,但我还是要说,因为没有一个答案是这样的:最后4个字节是原始长度MOD 2^32。