![]() |
Real-Bytes vertauschen
Hallo,
ich habe ein für Profis wahrscheinlich ziemlich einfach zu lösendes Problem: ich muss eine Real-Datei einlesen, die aus einer anderen Computer-Welt kommt (LabVIEW) und in der die 8 Byte der Real-Werte umgedreht sind (low => high). Wie kann man die wieder so drehen (high => low), dass Delphi 6 daraus den richtigen Real-Wert erkennt ? Schon mal danke im Voraus Pelzini |
Re: Real-Bytes vertauschen
Hallo Pelzini,
herzlich willkommen in der Delphi-PRAXiS. So etwa könnte es funktionieren:
Delphi-Quellcode:
Und so natürlich auch:
function ConvertDouble(d: double): double;
var pbIn, pbOut: PByte; begin pbIn := @d; Inc(pbIn, SizeOf(double)); pbOut := @Result; repeat Dec(pbIn); pbOut^:= pbIn^; Inc(pbOut); until pbIn = @d; end;
Delphi-Quellcode:
Grüße vom marabu
procedure SwapBytes(var buffer; size: word);
var b: byte; pbIn, pbOut: PByte; begin pbIn := @buffer; Inc(pbIn, size - 1); pbOut := @buffer; while Cardinal(pbIn) > Cardinal(pbOut) do begin b := pbOut^; pbOut^:= pbIn^; pbIn^ := b; Dec(pbIn); Inc(pbOut); end; end; |
Re: Real-Bytes vertauschen
so ginge es auch, wenn die high/low-DWords des Doubles in H und L stehen und die umgedrehten bytes nachher in den DWords H2, L2 stehen sollen:
Delphi-Quellcode:
und um die beiden einzelnen DWords des Doubles in die Variablen H und L zu bekommen, kannst du sowas hier nehmen:
asm
mov eax, H bswap eax mov edx, L bswap edx mov H2, edx mov L2, eax end;
Delphi-Quellcode:
p.s.: ungetestet!
var H, L: Integer;
D: Double; PD: ^Integer; begin D := 1234; PD := @D; H := Integer(PD^); Inc(PD); L := Integer(PD^); end; edit: bswap vertauscht einfach die bytes des Arguments, also aus z.b. "$ABCD" wird "$DCBA" |
Re: Real-Bytes vertauschen
Hallo marabu, hallo Black Jack,
danke, dass ihr so schnell reagiert habt. Marabu, ich habe deine erste Lösung (ConvertDouble) verwendet, und es klappt ganz einwandfrei. Ich hab's sogar verstanden, nachdem ich meine Kenntnisse über Pointer wieder etwas aufgefrischt habe. Die zweite Lösung und deine, Black Jack, werde ich interessehalber auch mal probieren. Nochmals vielen Dank! Pelzini |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz