![]() |
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:
Für 24 und 16Bit-Werte existieren entsprechende Routinen.
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; 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 |
AW: Konvertierung von BigEndian-Werten
Was hältst du von einem Varianten Record ? Damit würdest du die schieberei sparen
|
AW: Konvertierung von BigEndian-Werten
hast Du ein Beispiel?
Meiner Meinung nach komme ich um die Schieberei auf kenen Fall herum? Gruß K-H |
AW: Konvertierung von BigEndian-Werten
Naja, also kürzer ginge es wohl schon:
Delphi-Quellcode:
Ob das schneller ist? Kann sein. Weniger Funktionen ist es leider nicht - das wäre aber auch mit zusätzlichem Aufwand verbunden...
function SwapInt32(Value: Integer): LongWord; register;
asm BSWAP EAX end; function SwapInt16(Value: SmallInt): SmallInt; register; asm XCHG EAX end; (Code ungetestet, ich kenne mich nicht besonders mit Assembler aus...) |
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; |
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; |
AW: Konvertierung von BigEndian-Werten
Ansosnten wohl eher OR, anstatt +.
Delphi-Quellcode:
Und falls man Assembler nutzt, muß man später auch noch die 64-Bit-Version basteln, denn in Win64 sind die Register anders belegt.
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; |
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:
ganz gut passen.
Result:=0;
(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 |
AW: Konvertierung von BigEndian-Werten
Zitat:
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. |
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 07:36 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 by Thomas Breitkreuz