Comment convertir des Int en octets en Python 2 et Python 3
-
Méthode de conversion
intenbytescompatible avec Python 2.7 et 3 -
Python 3 Seulement les méthodes de conversion
intenbytes - Comparaison des performances
La conversion de int en bytes est l’opération inverse de la conversion de bytes en int qui est introduite dans le dernier tutoriel HowTo. La plupart des méthodes int-to-bytes introduites dans cet article sont les méthodes inverses des méthodes bytes-to-int.
Méthode de conversion int en bytes compatible avec Python 2.7 et 3
Vous pouvez utiliser la fonction pack dans le Python struct module pour convertir l’entier en octets dans le format spécifique.
>>> import struct
>>> struct.pack("B", 2)
'\x02'
>>> struct.pack(">H", 2)
'\x00\x02'
>>> struct.pack("<H", 2)
'\x02\x00'
Le premier argument de la fonction struct.pack est la chaîne de format qui spécifie le format des octets comme la longueur de l’octet, le signe, l’ordre des octets (petit ou grand endian), etc.
Python 3 Seulement les méthodes de conversion int en bytes
Utilisez bytes pour convertir int en bytes
Comme indiqué dans le dernier article, bytes est un type de données intégré de Python 3. Vous pourriez facilement utiliser bytes pour convertir les entiers 0~255 en octets.
>>> bytes([2])
b'\x02'
L’entier doit être entouré par la parenthèse, sinon, vous obtiendrez l’objet octets de taille donnée par le paramètre initialisé avec des octets nuls mais pas les octets correspondants.
>>> bytes(3)
b'\x00\x00\x00'
Utilisez la méthode int.to_bytes() pour convertir int en bytes
Depuis Python3.1, une nouvelle méthode de classe d’entier int.to_bytes() est introduite. C’est la méthode de conversion inverse de int.from_bytes() comme discuté dans le dernier article.
>>> (258).to_bytes(2, byteorder="little")
b'\x02\x01'
>>> (258).to_bytes(2, byteorder="big")
b'\x01\x02'
>>> (258).to_bytes(4, byteorder="little", signed=True)
b'\x02\x01\x00\x00'
>>> (-258).to_bytes(4, byteorder="little", signed=True)
b'\xfe\xfe\xff\xff'
Le premier argument est la longueur des données converties en octets, le second argument byteorder définit l’ordre des octets comme étant petit ou grand, et l’argument optionnel signed détermine si le complément de deux est utilisé pour représenter l’entier.
Comparaison des performances
En Python 3, vous avez 3 façons de convertir des int en bytes,
- Méthode
bytes() - Méthode
struct.pack() int.to_bytes()méthode
Nous vérifierons le temps d’exécution de chaque méthode pour comparer leurs performances, et enfin nous vous donnerons la recommandation si vous voulez augmenter la vitesse d’exécution de votre code.
>>> import timeint
>>> timeit.timeit('bytes([255])', number=1000000)
0.31296982169325455
>>> timeit.timeit('struct.pack("B", 255)', setup='import struct', number=1000000)
0.2640925447800839
>>> timeit.timeit('(255).to_bytes(1, byteorder="little")', number=1000000)
0.5622947660224895
| Méthode de conversion | -Temps d’exécution (1 million de fois) |
|---|---|
bytes() |
0.31296982169325455 s |
struct.pack() |
0.2640925447800839 s |
int.to_bytes() |
0.5622947660224895 s |
Par conséquent, veuillez utiliser la fonction struct.pack() pour effectuer la conversion int-to-bytes afin d’obtenir la meilleure performance d’exécution, bien qu’elle soit déjà introduite dans la branche Python 2.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook