web-dev-qa-db-fra.com

Comment échanger des octets un entier 32 bits en python?

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?

17
Patrick B.

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é).

22
Carsten

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))
23
nos

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.

11
Artem Zankovich