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\0x1signifie que\x00est l’octet de poids fort et\x01est l’octet de poids faible.HHsignifie qu’il y a deux objets de typeHdans la chaîne d’octets.Hrepré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