Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Real-Bytes vertauschen (https://www.delphipraxis.net/53629-real-bytes-vertauschen.html)

Pelzini 20. Sep 2005 10:49


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

marabu 20. Sep 2005 11:13

Re: Real-Bytes vertauschen
 
Hallo Pelzini,

herzlich willkommen in der Delphi-PRAXiS.

So etwa könnte es funktionieren:

Delphi-Quellcode:
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;
Und so natürlich auch:

Delphi-Quellcode:
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;
Grüße vom marabu

BlackJack 20. Sep 2005 13:12

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:
asm
  mov eax, H
  bswap eax

  mov edx, L
  bswap edx

  mov H2, edx
  mov L2, eax
end;
und um die beiden einzelnen DWords des Doubles in die Variablen H und L zu bekommen, kannst du sowas hier nehmen:
Delphi-Quellcode:
var H, L: Integer;
    D: Double;
    PD: ^Integer;
begin
D := 1234;
PD := @D;
H := Integer(PD^);
Inc(PD);
L := Integer(PD^);
end;
p.s.: ungetestet!

edit: bswap vertauscht einfach die bytes des Arguments, also aus z.b. "$ABCD" wird "$DCBA"

Pelzini 20. Sep 2005 14:43

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