Prenez cet exemple:
i = 0x12345678
print("{:08x}".format(i))
# shows 12345678
i = swap32(i)
print("{:08x}".format(i))
# should print 78563412
Quelle serait la swap32-function()
? Existe-t-il un moyen d'échanger des octets d'un int
en python, idéalement avec des outils intégrés?
Une méthode consiste à utiliser le module struct
:
def swap32(i):
return struct.unpack("<I", struct.pack(">I", i))[0]
D'abord, vous emballez votre entier dans un format binaire en utilisant une endianité, puis vous le décompressez en utilisant l'autre (peu importe la combinaison que vous utilisez, car tout ce que vous voulez faire est de permuter l'endianité).
Big endian signifie que la disposition d'un entier 32 bits a l'octet le plus significatif en premier,
par exemple. 0x12345678 a la disposition de la mémoire
msb lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
tandis que sur petit endian, la disposition de la mémoire est
lsb msb
+------------------+
| 78 | 56 | 34 | 12|
+------------------+
Vous pouvez donc simplement convertir entre eux avec un peu de masquage et de décalage:
def swap32(x):
return (((x << 24) & 0xFF000000) |
((x << 8) & 0x00FF0000) |
((x >> 8) & 0x0000FF00) |
((x >> 24) & 0x000000FF))
Depuis python 3.2, vous pouvez définir la fonction swap32 () comme suit:
def swap32(x):
return int.from_bytes(x.to_bytes(4, byteorder='little'), byteorder='big', signed=False)
Il utilise un tableau d'octets pour représenter la valeur et inverse l'ordre des octets en modifiant l'endianité lors de la conversion en entier.