如何使用zlib.NET扩展文件?

我正在使用zlib.NET库来尝试和扩充由zlib压缩的文件(可能在Linux机器上)。 这就是我正在做的事情:

zlib.ZInputStream zinput = new zlib.ZInputStream(File.Open(path, FileMode.Open, FileAccess.Read)); while (stopByte != (data = zinput.ReadByte())) { // check data here } zinput.Close(); 

数据字节与压缩数据字节匹配,因此我必须做错事。

除了在面对exception时未使用“using”语句来关闭流,除了我看起来没问题。 数据肯定是压缩的吗? 你能在Linux机器上用zlib解压缩吗?

查看了源代码后,它非常可怕 – 例如,调用int Read(buffer, offset, length)将最终调用其内部int Read()方法的length时间。 鉴于这种不稳定的开始,我不确定我是否会特别重视代码,但我已经预料到它至少会有点起作用! 你尝试过使用SharpZipLib吗?

看来我错误地假设所有虚拟方法都被覆盖了,事实并非如此。 我使用的是zlib.ZInputStream.ReadByte(),它只是inheritance的Stream.ReadByte(),它不会进行任何膨胀。

我使用zlib.ZInputStream.Read()代替它,它的工作方式应该如此。

跳过zlib头(前两个字节, 78 9C )然后使用内置到.net中的DeflateStream为我工作。

 using(var input = File.OpenRead(...)) using(var output = File.Create(...)) { // if there are additional headers before the zlib header, you can skip them: // input.Seek(xxx, SeekOrigin.Current); if (input.ReadByte() != 0x78 || input.ReadByte() != 0x9C)//zlib header throw new Exception("Incorrect zlib header"); using (var deflateStream = new DeflateStream(decryptedData, CompressionMode.Decompress, true)) { deflateStream.CopyTo(output); } } 

以下代码可以帮助你们。 实例化对象并使用这些function。

 public class FileCompressionUtility { public FileCompressionUtility() { } public static void CopyStream(System.IO.Stream input, System.IO.Stream output) { byte[] buffer = new byte[2000]; int len; while ((len = input.Read(buffer, 0, 2000)) > 0) { output.Write(buffer, 0, len); } output.Flush(); } public void compressFile(string inFile, string outFile) { System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION); System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open); try { CopyStream(inFileStream, outZStream); } finally { outZStream.Close(); outFileStream.Close(); inFileStream.Close(); } } public void uncompressFile(string inFile, string outFile) { int data = 0; int stopByte = -1; System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); zlib.ZInputStream inZStream = new zlib.ZInputStream(System.IO.File.Open(inFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)); while (stopByte != (data = inZStream.Read())) { byte _dataByte = (byte)data; outFileStream.WriteByte(_dataByte); } inZStream.Close(); outFileStream.Close(); } } 

更仔细地查看示例代码,它将数据从常规Filestream复制到ZOutputStream。 解压缩必须通过该层进行。

 private void decompressFile(string inFile, string outFile) { System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open); try { CopyStream(inFileStream, outZStream); } finally { outZStream.Close(); outFileStream.Close(); inFileStream.Close(); } } 

我最近有不幸的服务以前zlib’d使用PHP到各种浏览器和平台,包括IE7。 一旦我发现文档是zlib’d而不是gzip’d(当时的想法)我在.NET Framework v4中使用了SharpZipLib (利用Stream.CopyTo ):

 public static byte[] DecompressZlib(Stream source) { byte[] result = null; using (MemoryStream outStream = new MemoryStream()) { using (InflaterInputStream inf = new InflaterInputStream(source)) { inf.CopyTo(outStream); } result = outStream.ToArray(); } return result; } 

我想我会把它放在这里,以防任何人需要帮助从SharpZipLib使用的类。