2015-10-15 63 views
1

我有很多用Delphi编写的应用程序制作的文件,我想在C#应用程序中打开。我正在写作。用c#打开Delphi ZLib压缩数据#

解包文件的“老”德尔福代码:

InputStream := TFileStream.Create(InputFileName, fmOpenRead); 
OutputStream := TMemoryObjStream.Create; 
DecompressionStream := TZDecompressionStream.Create(InputStream); 
OutputStream.CopyFrom(DecompressionStream, 0); 

这是我用在C#中打开这些文件中的代码:

FS = new System.IO.FileStream(File, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read); 
System.IO.MemoryStream MS = new System.IO.MemoryStream(); 
ZLibNet.ZLibStream ZS = new ZLibNet.ZLibStream(S, ZLibNet.CompressionMode.Decompress); 
ZS.CopyTo(MS); 
ZS.Close(); 
FS.close(); 

如果我现在开始阅读“MS流”与二进制阅读器 我得到了一些奇怪的数据在前24个字节,然后我得到的值似乎是合乎逻辑的。
首先它应该读取一个Int32,它具有合理的价值。 之后,一个字符串,这个字符串显示为“\ 0 \ 0 \ 0ISua”,我期待“ISuarez”。但是如果我将流位置进一步移动一个字节,我会得到“Suarez \ n \ 0 \ 0 \ 0”
这让我想知道我是否可能会稍后开始读取流而不是字节,但如何执行此操作?

+0

这是zlib而不是ZIP。我认为你需要弄清楚压缩文件中有哪些头文件。 –

回答

0

我一直在这个问题上搁置了一段时间,最近做了另外一个试图解决它,并发现了什么是错误的:

德尔福的字符串后面的字符长度写入一个32位整数。

Binaryreader.Readstring在.net中,另一方面,读取一个字节由7相乘得到的字符串的长度,声明为什么我的前3个字符,其中空字符“0 \”

所以我写了我自己的字符串读取器:

enter code here 
     private String ReadString(System.IO.BinaryReader BR) 
    { 
     Int32 StringLength = BR.ReadInt32(); 
     Char[] Chars = BR.ReadChars(StringLength); 
     return new String(Chars); 
    } 

而且这工作正常。

此致敬礼!

0

嗨,我们有类似的问题。 .net中的Zlib不是Zlib。我们发现了超过10个带有“zlib”标签的Lib,但是它们不能像delphi一样进行压缩/解压缩。

我们努力在版本1.0.4.0中使用nuget包“zlib.net”。 这对我们有效。

0

真正的问题是什么是压缩数据,你不显示,但:

我有一个场景,我在Delphi压缩数据,并在C#中读取它需要的。这是跳过前两个字节的一个简单问题,因为Delphi中的zlib库在头文件中使用了两个字节,而C#中的Deflate例程没有。