Delphi 7和Delphi XE4中的解压缩流

时间:2013-12-11 07:19:52

标签: delphi delphi-7 delphi-xe4

以下是我的函数,它接受一个压缩文件并通过一次读取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;,但这不起作用。

2 个答案:

答案 0 :(得分:3)

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

两个输出之间的差别只是一个用8位编码编码,另一个用16位编码编码,可能是UTF-16。

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

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


另一个可能的原因是您的解压缩流类已损坏。它看起来像ZLib类,已知是好的。

答案 1 :(得分:1)

此更正应解决D7和DXE4之间的差异:

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

但是在处理内存时,最好避免使用会产生编码不利影响的字符……最好使用Byte

Buffer: array [0..1023] of **Byte**;

然后,没有缓冲区,那就更好了:

DestinationStream.CopyFrom(DecompressionStream , DecompressionStream.Size);