![]() |
Endian (Byte-Order) vertauschen
Prozeduren um von Little-Endian zu Big-Endian und umgekehrt zu konvertieren:
Delphi-Quellcode:
function ChangeEndian16(X: WORD): WORD; register; //oder auch Swap
asm xchg AL, AH end; function ChangeEndian32(X: DWORD): DWORD; register; asm bswap EAX //konvertiert Endian end; procedure ChangeEndian64(P: Pointer); register; asm mov EDX, [EAX] bswap EDX mov EBX, [EAX + $04] bswap EBX mov [EAX], EBX mov [EAX + $04], EDX end; |
Re: Endian (Byte-Order) vertauschen
Für alle, die mit dem Begriff Endian nichts anfangen können, so wie ich hier ein
![]() |
Re: Endian (Byte-Order) vertauschen
Ergänzend noch dazu zwei Methoden, um Single- und Double-Werte zu flippen:
Delphi-Quellcode:
Quelle:
type
BytePos = (EndVal, ByteVal); PEndianCnvDblRec = ^EndianCnvDblRec; PEndianCnvSnglRec = ^EndianCnvSnglRec; EndianCnvDblRec = packed record case pos: BytePos of EndVal: (EndianVal: double); ByteVal: (Bytes: array[0..SizeOf(Double)-1] of byte); end; EndianCnvSnglRec = packed record case pos: BytePos of EndVal: (EndianVal: Single); ByteVal: (Bytes: array[0..SizeOf(Single)-1] of byte); end; procedure SwapBytesDouble( A, B: PEndianCnvDblRec ); var i: integer; begin for i := high(A.Bytes) downto low(A.Bytes) do A.Bytes[i] := B.Bytes[High(A.Bytes) - i]; end; procedure SwapBytesSingle( A, B: PEndianCnvSnglRec ); var i: integer; begin for i := high(A.Bytes) downto low(A.Bytes) do A.Bytes[i] := B.Bytes[High(A.Bytes) - i]; end; ![]() |
Re: Endian (Byte-Order) vertauschen
Zitat:
|
Re: Endian (Byte-Order) vertauschen
Das reicht doch auch oder sehe ich das falsch?
Delphi-Quellcode:
function SwapBytes(const ANumber: Cardinal): Cardinal;
asm mov edx, ANumber; bswap edx; mov result, edx; end; |
Re: Endian (Byte-Order) vertauschen
Eigentlich reicht "BSWAP EAX".
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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