Inverser les octets d'un DWORD

Contenu du snippet

{ 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;
 
 

Compatibilité : Delphi 5

Disponible dans d'autres langages :

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.