用c#打开Delphi ZLib压缩数据

本文关键字:压缩 数据 ZLib Delphi 打开 | 更新日期: 2023-09-27 18:17:59

我有很多用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"
这让我想知道我是否可以稍后开始读取流的一些位而不是字节,但是如何做到这一点?

用c#打开Delphi ZLib压缩数据

你好,我们有一个类似的问题。Zlib在。net中不是Zlib。我们发现超过10个lib上面有"zlib"标签,但是不能像delphi那样压缩/解压缩。

我们结束了在1.0.4.0版本中使用nuget包"zlib.net"。

真正的问题是什么在压缩您的数据,您没有显示,但是:

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

我把这个问题搁置了一段时间,最近又做了一次尝试,发现了问题所在:

Delphi写一个32位整数作为字符串的长度,后跟字符。

主题。另一方面,.Net中的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);
    }

这个很好。

致以最亲切的问候!