我有许多用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流”,则我会在前24个字节中获取一些奇怪的数据,然后我得到的值似乎是合乎逻辑的。
首先,它应该读取一个Int32,它具有有意义的值。在该字符串之后,该字符串显示为“ \ 0 \ 0 \ 0ISua”,我希望在其中看到“ ISuarez”。但是,如果我将流位置再移动一个字节,我会得到“ Suarez \ n \ 0 \ 0 \ 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);
}
而且这很好。
最好的祝福!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句