用c#打开Delphi ZLib压缩数据

Open Delphi ZLib compressed data with c#

我有很多文件是用 Delphi 编写的应用程序制作的,我想在 C# 应用程序中打开这些文件。我正在写。

解压缩文件的'old' 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();

如果我现在开始用二进制 reader 阅读 "MS-stream" 我在前 24 个字节中得到了一些奇怪的数据,之后我得到了看起来合乎逻辑的值。
首先,它应该读取一个 Int32,它确实有一个合理的值。 之后是一个字符串,这个字符串在我期望的地方显示为“[=27=][=27=][=27=]ISua”"ISuarez"。但是如果我将流位置再移动一个字节,我会得到 "Suarez\n[=25=][=25=][=25=]"
这让我想知道我是否可以稍后开始读取流而不是字节,但如何做到这一点?

您好,我们遇到了类似的问题。 Zlib 不是 .Net 中的 Zlib。我们发现了超过 10 个带有 "zlib" 标签的库,但无法像 delphi 那样compress/uncompress。

我们在 1.0.4.0 版本中开始使用 nuget 包 "zlib.net"。 这对我们有用。

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

我有一个场景,我在 Delphi 中压缩数据并需要在 C# 中读取它。跳过前两个字节是一件简单的事情,因为 Delphi 中的 zlib 库使用 header 中的两个字节,而 C# 中的 Deflate 例程不会。

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

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

另一方面,.Net 中的

Binaryreader.Readstring 读取一个字节并将其乘以 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);
    }

这很好用。

此致!