> Does anyone know why the code fails to work? Not really, but at least the following is will be evaluated differently on 32 and 64 bit platforms:
> > ################################################### > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > 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); v is a byte, i is a longint (integer in Delphi mode). Outsize is an int64. On a 32 bit platform, "v shl (8 * i)" will be evaluated as 32 bit. This means that the upper 32 bits of the result of that expression will be discarded before the "or" operation is performed. On a 64 bit platform, that entire expression will be evaluated using 64 bit arithmetic. Jonas_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal