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