Delphi 7和Delphi XE4中的解压缩流

用户1556433

以下是我的函数,该函数接受压缩文件,并通过一次读取1024个字符将其转换为txt文件。

procedure DecompressFile(const ACompressedFile, ADestinationFile : String);
var
  SourceStream : TFileStream;
  DestinationStream : TFileStream;
  DecompressionStream : TDecompressionStream;

  nRead : Integer;
  Buffer: array [0..1023] of Char;
begin
  SourceStream := TFileStream.Create(ACompressedFile, fmOpenRead);
  try
    DestinationStream := TFileStream.Create(ADestinationFile, fmCreate);
    try
      DecompressionStream := TDecompressionStream.Create(SourceStream);
      try
        repeat
          nRead := DecompressionStream.Read(Buffer, 1024);
          DestinationStream.Write(Buffer, nRead);
        until nRead = 0;
      finally
        DecompressionStream.Free;
      end;
    finally
      DestinationStream.Free;
    end;
  finally
    SourceStream.Free;
  end;
end;

我的问题是,对于Delphi 7,这会生成正确的txt文件,但是对于Delphi XE4,它会在每个字符之间引入垃圾值。

例子:

Delphi 7: abcdedfgh
Delphi XE4: aNULbNULcNULdNULeNULfNULgNULhNUL

NUL插入每个字符之间。我试图更改声明

Buffer: array [0..1023] of Char;

到,Buffer: array [0..1023] of AnsiChar;但这没有用。

大卫·赫弗南(David Heffernan)

首先,让我们假设解压缩流类(无论它是什么)均已正确实现。在这种情况下,问题中的代码实际上很好。它成功解压缩了文件。虽然,这有点草率,因为它分配的缓冲区是您使用的缓冲区的两倍。缓冲区应该是字节数组,而不是char。使用SizeOf(Buffer)而不是重复该不可思议的1024常数。而Write调用最好是WriteBuffer来添加错误检查。

这两个输出之间的区别只是一个以8位编码进行编码,而另一个以16位编码(可能为UTF-16)编码。

很难说这是否是故意的。人们需要查看创建压缩文件的过程。例如,也许压缩文件是通过压缩Delphi字符串创建的。在D7中,该字符串是8位编码的,但是在DXE4中,它是16位编码的。

一个明显的步骤是比较两个输入文件,即D7与DXE4文件。您希望它们是相同的。但是,是吗?


然后,另一个可能的原因是您的解压缩流类已损坏。它看起来像ZLib类,被认为是很好的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Delphi XE4 RAD Studio中的DFM布局问题

来自分类Dev

Delphi XE4中的CharInSet编译器警告

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

来自分类Dev

Delphi 7和Delphi XE4中的解压缩流

来自分类Dev

从Delphi XEx(XE4)调试Dylib

来自分类Dev

Delphi XE和ZLib问题

来自分类Dev

Delphi 7至Delphi XE5

来自分类Dev

在Delphi 7中处理TIdHTTPServer中的PUT和DELETE请求

来自分类Dev

在Delphi XE4中突出显示变量和函数名称

来自分类Dev

使用TXMLTransformProvider组件的Delphi XE4中的&和CRLF问题的解决方法

来自分类Dev

在Delphi XE2和Delphi XE7中LongMonthNames的用法

来自分类Dev

使用Delphi(XE4)和Word_Tlb合并表中的单元格

来自分类Dev

在Delphi XE7 Android中的Messagedlg

来自分类Dev

Delphi 7中的类变量

来自分类Dev

Delphi XE4的单元测试工具

来自分类Dev

Delphi XE4 FireMonkey TMemo透明吗?(iOS)

来自分类Dev

标签和速度按钮未在玻璃框架中显示-Delphi XE4

来自分类Dev

安装Delphi XE4时,在Delphi XE2中丢失了TeeChart / TChart

来自分类Dev

字符串[80]与Delphi 7和Delphi XE4中的字符串之间的区别

来自分类Dev

Delphi XE4 RAD Studio中的DFM布局问题

来自分类Dev

Delphi XE4中的EDOMParseError

来自分类Dev

E2010不兼容的类型:Delphi XE4中的“ LPQUERY_SERVICE_CONFIGW”和“ PQueryServiceConfigA”错误

来自分类Dev

Delphi XE4 64位内存不足

来自分类Dev

Delphi XE4中的编译错误

来自分类Dev

在Delphi 7中处理TIdHTTPServer中的PUT和DELETE请求

来自分类Dev

在Delphi XE4和Devexpress VCL 13.1.2中粘贴一行时,TableView不更新

来自分类Dev

Delphi 7中的ClassInfo函数

来自分类Dev

Delphi XE和Unicode

Related 相关文章

热门标签

归档