【问题标题】:Zlib in Delphi 2009德尔福 2009 中的 Zlib
【发布时间】:2009-06-03 09:44:36
【问题描述】:

我正在将应用程序升级到 Delphi 2009。该应用程序使用 Soap,我们使用 Zlib 压缩肥皂请求和响应流。这在 Delphi 2006 中运行良好,但在 Delphi 2009 中却不行。

所以我回到 Delphi 2006 并改用 FastZlib。在 Delphi 2006 中一切正常,但在 Delphi 2009 中无法正常工作,并且出现解压缩错误。

还有其他人遇到过这个问题吗?

我该如何解决这个问题?

桑迪普

【问题讨论】:

  • 如果您发布错误和一些代码会有所帮助吗?
  • 确实,您需要告诉我们您遇到的具体错误以及您在遇到这些错误时调用的函数。
  • 我猜 FastZlib 使用 PChar 而不是 PAnsiChar。在 Delphi 2009 SizeOf(Char) = 2 而不是 Delphi 2006 中的 1 个字节。

标签: delphi soap delphi-2009 zlib compression


【解决方案1】:

我刚刚查看了内置的 Zlib.pas,它似乎已针对 D2009 正确更新。什么给你带来了问题?

【讨论】:

    【解决方案2】:

    在 delphi 2006 中,我有以下使用 Zlib 压缩和解压缩的方法(来自 Delphi 2006)

    procedure CompressStream(inpStream, outStream: TStream);
    var
      InpBuf, OutBuf: Pointer;
      InpBytes, OutBytes: Integer;
    begin
      InpBuf := nil;
      OutBuf := nil;
      try
        GetMem(InpBuf, inpStream.Size);
        inpStream.Position := 0;
        InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
        CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
        outStream.Write(OutBuf^, OutBytes);
      finally
        if InpBuf <> nil then FreeMem(InpBuf);
        if OutBuf <> nil then FreeMem(OutBuf);
      end;
    end;
    
    
    { Decompress a stream }
    procedure DecompressStream(inpStream, outStream: TStream);
    var
      InpBuf, OutBuf: Pointer;
      OutBytes, sz: Integer;
    begin
      InpBuf := nil;
      OutBuf := nil;
      sz     := inpStream.Size - inpStream.Position;
      if sz > 0 then 
        try
          GetMem(InpBuf, sz);
          inpStream.Read(InpBuf^, sz);
          DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
          outStream.Write(OutBuf^, OutBytes);
        finally
          if InpBuf <> nil then FreeMem(InpBuf);
          if OutBuf <> nil then FreeMem(OutBuf);
        end;
      outStream.Position := 0;
    end;
    

    为了在 Delphi 2009 中工作,我应该进行哪些更改?

    【讨论】:

    • 嗯,您正在以其他用户身份登录。相反,请使用您发布问题并进行编辑时使用的用户名登录。
    【解决方案3】:

    可能值得一试的方法 - 压缩您的数据,然后对其进行 UUENCODE,然后在另一端反转该过程。这将检测某些代码是否没有正确处理嵌入的零。

    抱歉,这只是帮助您缩小问题范围的部分解决方案。

    【讨论】:

      【解决方案4】:

      原发帖人很清楚这个问题:CompressBuf 和 DecompressBuf 都消失了。

      我还有一个项目在 D7 中编译得很好,但在 D2010 中编译失败,因为它找不到“CompressBuf”或“DecompressBuf”。

      使用 D7 非常令人愉快的 find 命令进行的搜索将例程定位在 c:\Program Files\Borland\Delphi7\Source\Rtl\Common\ZLib.pas

      但是使用 D2010 的(单独的尴尬)“在文件中查找”命令搜索无法在任何地方找到 CompressBuf 或 DecompressBuf。

      升级 IDE 会导致项目中使用和需要的例程消失,这非常令人不安!

      【讨论】:

      • CompressBufDecompressBuf 分别重命名为 ZCompressZDecompress。它发生在 2007 年和 XE 之间,但我不确定具体时间,因为我没有安装 2009 或 2010。如果我不得不冒险猜测,我会说它发生在 2009 年。
      【解决方案5】:

      在 D2009 中,您可以使用 ZCompress/ZDecompress 代替 CompressBuf/DecompressBuf
      我测试了一下,没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多