【发布时间】:2016-11-20 22:37:06
【问题描述】:
我如何知道我使用的 GzipStream 压缩文件的大小?我知道它有一个标题和后缀。前 10 个字节 - 它是标题,后 8 个字节 - 后缀。怎么知道后缀文件的大小?
【问题讨论】:
-
这是不言而喻的,但我还是会说,因为没有一个答案可以:最后 4 个字节是原始长度 MOD 2^32。
标签: c# .net filestream gzipstream
我如何知道我使用的 GzipStream 压缩文件的大小?我知道它有一个标题和后缀。前 10 个字节 - 它是标题,后 8 个字节 - 后缀。怎么知道后缀文件的大小?
【问题讨论】:
标签: c# .net filestream gzipstream
写得更好一点:
public int GetUncompressedSize(string FileName)
{
using(BinaryReader br = new BinaryReader(File.OpenRead(pathToFile))
{
br.BaseStream.Seek(SeekOrigin.End, -4);
return br.ReadInt32();
}
}
【讨论】:
我看到您很可能对我之前的答案投了反对票,因为它是一个使用 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 的示例。原理还是一样的,所以你的问题的答案是最后 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;
}
【讨论】: