【问题标题】:Open Delphi ZLib compressed data with c#用c#打开Delphi ZLib压缩数据
【发布时间】:2015-10-15 09:05:16
【问题描述】:

我有很多用 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”
这让我想知道我是否可以稍后开始读取流而不是字节,但是该怎么做呢?

【问题讨论】:

  • 这是 zlib 而不是 ZIP。我认为您需要弄清楚压缩文件中存在哪些标头。

标签: c# delphi stream zlib


【解决方案1】:

您好,我们遇到了类似的问题。 Zlib 不是 .Net 中的 Zlib。我们发现了 10 多个带有“zlib”标签的 Lib,但它们无法像 delphi 那样以相同的方式压缩/解压缩。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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);
          }
      

      这很好用。

      最好的问候!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多