Comment convertir des octets en entiers en Python 2.7 et 3.x
Le type de données Bytes
a la valeur allant de 0 à 255 (0x00 à 0xFF). Un octet a 8 bits, c’est pourquoi sa valeur maximale est 0xFF. Dans certaines circonstances, vous devez convertir les octets ou le tableau d’octets en nombres entiers pour un traitement ultérieur des données. Ce court article présente comment faire la conversion d’octets en entiers.
Python 2.7 Bytes Type de données
Il n’y a pas de type de données bytes
intégré dans la version 2.7 de Python. Le mot-clé byte
est identique à str
.
>>> bytes is str
True
bytearray
is used to define a bytes
or byte array
object.
>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')
Convertir des octets en entiers en Python 2.7
Le module interne Python struct
peut convertir des données binaires (octets) en entiers. Il peut convertir des octets ou des chaînes de caractères en Python 2.7 et des entiers de manière bidirectionnelle.
struct.unpack(fmt, string)
# Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.
Exemples de struct
import struct
testBytes = b"\x00\x01\x00\x02"
testResult = struct.unpack(">HH", testBytes)
print testResult
(1, 2)
La chaîne de format >HH
contient deux parties.
>
indique que les données binaires sontbig-endian
, ou en d’autres termes, les données sont ordonnées à partir du big end (bit le plus significatif). Par exemple,\x00\0x1
signifie que\x00
est l’octet de poids fort et\x01
est l’octet de poids faible.HH
signifie qu’il y a deux objets de typeH
dans la chaîne d’octets.H
représente un entier court non signé qui prend 2 octets.
Vous pourriez obtenir des résultats différents à partir de la même chaîne si le format de données assigné est différent.
>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)
Ici, <
indique que l’endianess est little-endian
. Par conséquent, \x00\x01
devient 00+1*256 = 256
, et non plus 0*256+1 = 1
.
>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)
B
signifie que les données sont des char non signés
sur 1 octet. Ainsi, \x00\x01\x00\x02
sera converti en 4 valeurs de unsigned char
, et non plus 2 valeurs de unsigned short
.
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3
Vous pouvez consulter le document officiel du module struct
pour obtenir plus d’informations sur format strings.
Python 3 Bytes Type de données
Les bytes
sont un type de données intégré dans Python 3, par conséquent, vous pouvez définir les octets directement en utilisant le mot-clé bytes
.
>>> testByte = bytes(18)
>>> type(testByte)
<class 'bytes'>
Vous pouvez aussi définir directement un octet ou un tableau d’octets comme ci-dessous
>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
<class 'bytes'>
Convertir des octets en entiers en Python 3
En plus du module struct
comme déjà introduit dans Python 2.7, vous pourriez aussi utiliser la nouvelle méthode intégrée des entiers de Python 3 pour faire les conversions d’octets en entiers, c’est-à-dire la méthode int.from_bytes()
.
int.from_bytes()
Exemples
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712
L’option byteorder
est similaire à la définition de l’ordre des octets du format struct.unpack()
.
int.from_bytes()
a une troisième option signed
pour assigner le type d’entier à être signed
ou unsigned
.
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824
Utilisez []
Quand Bytes est un unsigned char
Si le format des données a le format d’un unsigned chart
qui ne contient qu’un octet, vous pourriez utiliser directement l’index d’objet pour accéder et aussi obtenir l’entier des données.
>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16
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