以下是我的函数,该函数接受压缩文件,并通过一次读取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;
但这没有用。
首先,让我们假设解压缩流类(无论它是什么)均已正确实现。在这种情况下,问题中的代码实际上很好。它成功解压缩了文件。虽然,这有点草率,因为它分配的缓冲区是您使用的缓冲区的两倍。缓冲区应该是字节数组,而不是char。使用SizeOf(Buffer)而不是重复该不可思议的1024常数。而Write调用最好是WriteBuffer来添加错误检查。
这两个输出之间的区别只是一个以8位编码进行编码,而另一个以16位编码(可能为UTF-16)编码。
很难说这是否是故意的。人们需要查看创建压缩文件的过程。例如,也许压缩文件是通过压缩Delphi字符串创建的。在D7中,该字符串是8位编码的,但是在DXE4中,它是16位编码的。
一个明显的步骤是比较两个输入文件,即D7与DXE4文件。您希望它们是相同的。但是,是吗?
然后,另一个可能的原因是您的解压缩流类已损坏。它看起来像ZLib类,被认为是很好的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句