我正在使用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();
数据字节与压缩数据字节匹配,因此我必须做错事。
答案 0 :(得分:7)
除非在面对异常时未使用“using”语句关闭流,否则对我来说没什么问题。数据肯定是压缩的吗?你能用linux上的zlib解压缩吗?
查看源代码后,它非常可怕 - 例如,对int Read(buffer, offset, length)
的调用将最终调用其内部int Read()
方法length
次。鉴于这种不稳定的开始,我不确定我是否会特别信任这些代码,但我已经预计它至少可以轻微了!您是否尝试过使用SharpZipLib?
答案 1 :(得分:7)
看来我错误地假设所有虚拟方法都被覆盖了,事实并非如此。我使用的是zlib.ZInputStream.ReadByte(),它只是继承的Stream.ReadByte(),它不会进行任何膨胀。
我使用的是zlib.ZInputStream.Read(),它的工作原理应该如此。
答案 2 :(得分:3)
删除zlib标头(前两个字节,78 9C
),然后使用.net中内置的this documentation page为我工作。
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);
}
}
答案 3 :(得分:2)
以下代码可以帮助你们。实例化对象并使用函数。
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();
}
}
答案 4 :(得分:0)
更仔细地查看示例代码,它将数据从常规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();
}
}
答案 5 :(得分:0)
我最近遇到了以前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使用这些类。