Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Konvertierung von BigEndian-Werten (https://www.delphipraxis.net/169483-konvertierung-von-bigendian-werten.html)

p80286 23. Jul 2012 13:16

Konvertierung von BigEndian-Werten
 
Hallo zusammen,

ich muß BigEndian-Werte aus einer Datei auslesen und dann "normal" weiter verarbeiten.
Dafür nutze ich folgende Routine
Delphi-Quellcode:
type
  ta4 = array [0..3] of byte;
  tpa4= ^ta4;

function Big2Little32(ina:tpa4):integer;
begin
  result:=ina[3]+
          ina[2] shl 8+
          ina[1] shl 16+
          ina[0] shl 24;
end;
Für 24 und 16Bit-Werte existieren entsprechende Routinen.

Ist dieser Weg (nahezu) optimal oder gibt es einen besseren? ggf nur eine Routine für mehrere Größen(16,24,32...Bit)?

Gruß
K-H

guinnes 23. Jul 2012 13:18

AW: Konvertierung von BigEndian-Werten
 
Was hältst du von einem Varianten Record ? Damit würdest du die schieberei sparen

p80286 23. Jul 2012 13:24

AW: Konvertierung von BigEndian-Werten
 
hast Du ein Beispiel?
Meiner Meinung nach komme ich um die Schieberei auf kenen Fall herum?

Gruß
K-H

jfheins 23. Jul 2012 13:34

AW: Konvertierung von BigEndian-Werten
 
Naja, also kürzer ginge es wohl schon:
Delphi-Quellcode:
function SwapInt32(Value: Integer): LongWord; register;
asm
  BSWAP EAX
end;

function SwapInt16(Value: SmallInt): SmallInt; register;
asm
  XCHG EAX
end;
Ob das schneller ist? Kann sein. Weniger Funktionen ist es leider nicht - das wäre aber auch mit zusätzlichem Aufwand verbunden...
(Code ungetestet, ich kenne mich nicht besonders mit Assembler aus...)

Bummi 23. Jul 2012 13:36

AW: Konvertierung von BigEndian-Werten
 
Delphi-Quellcode:
function Swap(Value: Cardinal): Cardinal;
  asm
     BSWAP EAX
  end;
// gibts auch noch:

function SwapUInt64(X: UInt64): UInt64;
asm
  mov EDX,dword ptr [X]
  mov EAX,dword ptr [X+4]
  bswap EDX
  bswap EAX
end;

guinnes 23. Jul 2012 13:39

AW: Konvertierung von BigEndian-Werten
 
Delphi-Quellcode:
TConvert = Record
  case integer of
    0 : (Bytes : Array[0..3] of Byte);
    1 : (MyInt : Integer);
end;

function Big2Little32(ina:tpa4):integer;
var
  lConvert : TConvert;
begin
  lConvert.Bytes[0] := ima[3];
  lConvert.Bytes[1] := ina[2];
  lConvert.Bytes[2] := ina[1];
  lConvert.Bytes[3] := ina[0];
  Result ;) lConvert.MyInt;
end;

himitsu 23. Jul 2012 13:45

AW: Konvertierung von BigEndian-Werten
 
Ansosnten wohl eher OR, anstatt +.
Delphi-Quellcode:
function Big2Little32(ina: tpa4): LongInt;
begin
  Result:=ina[3] or
          ina[2] shl 8 or
          ina[1] shl 16 or
          ina[0] shl 24;
end;
Und falls man Assembler nutzt, muß man später auch noch die 64-Bit-Version basteln, denn in Win64 sind die Register anders belegt.

p80286 23. Jul 2012 15:15

AW: Konvertierung von BigEndian-Werten
 
Vielen Dank!
Da hab ich ja jetzt etwas zum ausprobieren.

@Himitsu
Ich denke Deiner Version würde noch ein
Delphi-Quellcode:
Result:=0;
ganz gut passen.
(was man mit OR so assoziiert..)

Da ich mit ASM seit Jahren nichts mehr gemacht habe, mal sehen was daraus wird.

Vielen Dank nochmal

K-H

himitsu 23. Jul 2012 15:55

AW: Konvertierung von BigEndian-Werten
 
Zitat:

Zitat von p80286 (Beitrag 1175686)
Ich denke Deiner Version würde noch ein
Delphi-Quellcode:
Result:=0;
ganz gut passen.
(was man mit OR so assoziiert..)

Aber nur wenn man das Result auch mit ein-or-t
Delphi-Quellcode:
Result := Result or ...

Und wenn, dann hätte man das beim + auch schon mit machen müssen. :angle:

Hier werden ja nur die 4 ina's ver-or-t und ich hoffe mal diese sind ordentlich initialisiert.

SirThornberry 23. Jul 2012 16:27

AW: Konvertierung von BigEndian-Werten
 
Wenn du nicht für alles eine eigene Funktion willst könntest du auch einen pointer auf die Daten + die Datengröße übergeben und anhand dessen dann entsprechend viele Bytes switchen


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz