Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Endian (Byte-Order) vertauschen (https://www.delphipraxis.net/125740-endian-byte-order-vertauschen.html)

Cyf 10. Dez 2008 23:05


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;

RWarnecke 11. Dez 2008 05:34

Re: Endian (Byte-Order) vertauschen
 
Für alle, die mit dem Begriff Endian nichts anfangen können, so wie ich hier ein Link zu Wikipedia, wo alles erklärt ist.

CalganX 15. Mai 2009 10:21

Re: Endian (Byte-Order) vertauschen
 
Ergänzend noch dazu zwei Methoden, um Single- und Double-Werte zu flippen:

Delphi-Quellcode:
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;
Quelle: http://edn.embarcadero.com/article/28964

himitsu 15. Mai 2009 10:30

Re: Endian (Byte-Order) vertauschen
 
Zitat:

Zitat von CalganX
Ergänzend noch dazu zwei Methoden, um Single- und Double-Werte zu flippen: ...

wobei man natürlich auch ganz einfach Single an ChangeEndian32 und Double an ChangeEndian64 übergeben könnte :angel:

Tyrael Y. 15. Mai 2009 11:24

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;

Dax 15. Mai 2009 11:27

Re: Endian (Byte-Order) vertauschen
 
Eigentlich reicht "BSWAP EAX".


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.

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