我有很多用Delphi编写的应用程序编写的文件,我想在C#应用程序中打开。我现在正在写作。
解压缩文件的'旧'Delphi代码是:
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-stream”
我在前24个字节中得到了一些奇怪的数据,之后我得到了似乎合乎逻辑的值
首先,它应该读取它所做的Int32,它具有合理的价值。
在那之后是一个字符串,这个字符串显示为“\ 0 \ 0 \ 0ISua”,我期待“ISuarez”。但是如果我将流位置进一步移动一个字节,我得到“Suarez \ n \ 0 \ 0 \ 0”
这让我想知道我是否可能稍后开始读取流而不是字节,但是如何做到这一点?
答案 0 :(得分:0)
您好我们有类似的问题。 Zlib不是.Net中的Zlib。我们发现了超过10个自由人的帽子" zlib"标签,但不能像delphi一样压缩/解压缩。
我们努力使用nuget包" zlib.net"在1.0.4.0版中。 这对我们有用。
答案 1 :(得分:0)
真正的问题是什么是压缩您的数据,但您没有显示,但是:
我有一个场景,我在Delphi中压缩数据并需要在C#中读取它。跳过前两个字节很简单,因为Delphi中的zlib库在头文件中使用了两个字节,C#中的Deflate例程没有。
答案 2 :(得分:0)
我把这个问题放在货架上一段时间了,最近又做了另一次尝试解决它,发现了什么问题:
Delphi为字符串的长度写入一个32位整数,后跟字符。
另一方面,.Net中的Binaryreader.Readstring读取一个字节并将其乘以7以获得字符串的长度,这表明为什么我的前3个字符为空字符" 0 \"所以我写了自己的stringreader:
enter code here
private String ReadString(System.IO.BinaryReader BR)
{
Int32 StringLength = BR.ReadInt32();
Char[] Chars = BR.ReadChars(StringLength);
return new String(Chars);
}
这很好用。
祝你好运!