{ Inversion des bytes (methode swap) pour type Word, Cardinal (DWord) et Int64 (QWord) et tout autres données.
Les methodes sont ecrites en assembleur integré pour alléger au maximum le code,
la ou il faudrait plusieurs instruction a base de shl et shr.
word : BSwap(word($AABB)) = $BBAA
cardinal : BSwap(cardinal($AABBCCDD)) = $DDCCBBAA
int64 : BSwap(int64($11223344AABBCCDD)) = $DDCCBBAA44332211
}
{ interface }
function BSwap(const a : word) : word; overload;
function BSwap(const a : cardinal) : cardinal; overload;
function BSwap(const a : int64) : int64; overload;
procedure BSwap(const BufferIn, BufferOut : pointer; const BufferLen : integer); overload;
{ implementation }
function BSwap(const a : word) : word;
asm
xchg al,ah;
end;
function BSwap(const a : cardinal) : cardinal;
asm
bswap eax;
end;
function BSwap(const a : int64) : int64;
asm
MOV EDX,[EBP+$08];
MOV EAX,[EBP+$0C];
BSWAP EAX;
BSWAP EDX;
end;
procedure BSwap(const BufferIn, BufferOut : pointer; const BufferLen : integer);
var pBi,pBo : PChar; // vieille achtuce qui a fait ses preuves ;)
N,L : integer;
begin
// aucunes gestion des erreurs, c'est au dev de verifier les parametres passés a BSwap.
pBi := BufferIn;
pBo := BufferOut;
L := BufferLen-1;
for N := 0 to L do
pBo[L-N] := pBi[N];
end;