Ich sehe mal wieder für Lauter Bämen den Wald nicht, und deswegen frage ich euch.
Ich habe mir ein Programm gebastelt, welches Extended werte in einen TFilestream Speichert und auch wieder laden kann.
Nun versuche ich die so gespeicherten Dateien auf dem Pi wieder zu laden und zu speichern.
Das Problem auf dem Pi ist sozeof(extended) = 8, während es auf meiner x86 Maschine 10 ist.
Nun habe ich mir eine Laden und eine Speichern Routine geschrieben, welche das Problem entsprechend umschiffen soll. Das Laden der 10-bit Extended auf dem Pi geht wunderbar. Nur leider funktioniert die Speichern Routine noch nicht, könnt ihr mir weiter helfen ?
Code: Alles auswählen
Program project1;
Uses sysutils, Classes, math;
Function Read10ByteExtended(Const Stream: Tstream): Extended; // Liest den TFIlestream eines 10Byte extended gespeicherten Wertes aus und legt ihn in der 8-Byte variable ab.
Var
data: Array[0..9] Of byte;
i: integer;
Exponent: integer;
Mantissa: extended;
Begin
For i := 0 To 9 Do
data[9 - i] := 0;
stream.read(data[9 - i], 1);
If ((data[0] And 128) = 128) Then Begin
result := -1;
End
Else Begin
result := 1;
End;
data[0] := data[0] And 127; // Clear Sign Bit
Exponent := ((data[0] Shl 8) Or data[1]) - 16382; // Calculate Exponent
// Add Mantissa, shouldnt this be 1 ??, but it is working
Mantissa := 0;
mantissa := mantissa + data[2] / 256;
mantissa := mantissa + data[3] / (256 * 256);
mantissa := mantissa + data[4] / (256 * 256 * 256);
mantissa := mantissa + data[5] / (256 * 256 * 256 * 256);
mantissa := mantissa + data[6] / (256 * 256 * 256 * 256 * 256);
mantissa := mantissa + data[7] / (256 * 256 * 256 * 256 * 256 * 256);
// Not possible on Arm
// mantissa := mantissa + data[8] / (256 * 256 * 256 * 256 * 256 * 256 * 256);
// mantissa := mantissa + data[9] / (256 * 256 * 256 * 256 * 256 * 256 * 256 * 256);
result := result * Mantissa * power(2, Exponent);
End;
Procedure Write10ByteExtended(val: extended; Const Stream: TStream); // Soll eine 8-byte Extended abspeichern, als sei sie 10-Byte Groß
//Type
// pint32 = ^int32;
Var
data: Array[0..9] Of byte;
i: integer;
Exponent: integer;
Begin
For i := 0 To 9 Do
data[i] := 0;
If val < 0 Then data[0] := data[0] Or 128;
Exponent := 0;
While val < 1 Do Begin
Exponent := Exponent + 1;
val := val * 2;
End;
While val > 2 Do Begin
Exponent := Exponent - 1;
val := val / 2;
End;
Exponent := exponent + 16382;
data[0] := data[0] Or ((exponent Shr 8) And ($7F));
data[1] := Exponent And $FF;
data[2] := Trunc(val * 256);
data[3] := Trunc(val * 256 * 256);
data[4] := Trunc(val * 256 * 256 * 256);
data[5] := Trunc(val * 256 * 256 * 256 * 256);
data[6] := Trunc(val * 256 * 256 * 256 * 256 * 256);
data[7] := Trunc(val * 256 * 256 * 256 * 256 * 256 * 256);
For i := 0 To 9 Do Begin
stream.write(data[9 - i], 1);
End;
End;
Var
f: TFilestream;
s: Single;
d: Double;
e: Extended;
Begin
{ // Code zum Speichern
f := TFileStream.Create('x68Out.dat', fmCreate Or fmOpenWrite);
s := 12.4;
d := 23.4;
e := 0.123;
f.Write(s, sizeof(s));
f.Write(d, sizeof(d));
If SizeOf(extended) = 10 Then Begin
f.Write(e, sizeof(e));
End
Else Begin
Write10ByteExtended(e, f);
End;
f.free;
// -- Write Ende }
// { // Code zum Lesen
f := TFileStream.Create('piOut.dat', fmOpenRead);
s := 0;
d := 0;
e := 0;
f.read(s, sizeof(s));
f.read(d, sizeof(d));
If SizeOf(extended) = 10 Then Begin
f.read(e, sizeof(e));
End
Else Begin
e := Read10ByteExtended(f);
End;
f.free;
// -- Read Ende }
writeln(format('%0.3f', [s]));
writeln(format('%0.3f', [d]));
writeln(format('%0.3f', [e]));
End.