[fpc-pascal] LZMA Algorithm fails on 64bit
Matthias Klumpp
matthias at nlinux.org
Fri Jan 22 19:38:16 CET 2010
Hello!
I use the LZMA-SDK for Pascal to compress files. (
http://www.birtles.org.uk/programming/ )
I can compress files on 64bit and 32bit architecture. But if I try to
decompress LZMA-Compressed files on AMD64, it fails.
I use code [-1-] to decompress files. The action works perfectly on i386,
but if I compile it for AMD64 usi9ng FPC 2.4.0 it fails throwing the
exception 'Error in data stream'. It fails at code [-2-] in
TLZMADecoder.Code because pos0 is greater than nowPos64.
I'am trying now for about half a week to solve this problem, but I don't
have any idea now, why this happens on AMD64. The code does not use any
pointers which could be wrong, but maybe a type conversion from Int64 to
Int32...
Does anyone know why the code fails to work? Is this a bug in FPC?
Kind regards
Matthias Klumpp
###################################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSequence [-1-]:
-----
var inStream:TBufferedFS;
outStream:TBufferedFS;
decoder: TLZMADecoder;
properties:array[0..4] of byte;
filesize,outSize:Int64;
i: Integer;
v: byte;
const propertiessize=5;
begin
if not FileExists(ipkfile) then Exception.Create('IPK file does not
exists!');
try
inStream:=TBufferedFS.Create(ipkfile, fmOpenRead or fmShareDenyNone);
try
outStream:=TBufferedFS.Create(workdir+'ipktar.tar', fmCreate);
decoder:=TLZMADecoder.Create;
inStream.position:=0;
with decoder do
begin
if inStream.read(properties, propertiesSize) <> propertiesSize then
raise Exception.Create('input .lzma file is too short');
if not SetDecoderProperties(properties) then
raise Exception.Create('Incorrect stream properties');
outSize := 0;
for i := 0 to 7 do
begin
v := inStream.ReadByte;
if v < 0 then
raise Exception.Create('Can''t read stream size');
outSize := outSize or v shl (8 * i);
end;
if not Code(inStream, outStream, outSize) then
raise Exception.Create('Error in data stream');
end;
decoder.Free;
finally
outStream.Free;
end;
finally
inStream.Free;
end;
end;
###################################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSequence [-2-]:
-----
if (rep0 >= nowPos64) or (rep0 >= m_DictionarySizeCheck) then
begin
m_OutWindow.Flush();
result:=false;
exit;
end;
###################################################
More information about the fpc-pascal
mailing list