Comment convertir des octets en entiers en Python 2.7 et 3.x

Jinku Hu 10 octobre 2023
  1. Python 2.7 Bytes Type de données
  2. Python 3 Bytes Type de données
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.

  1. > indique que les données binaires sont big-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.
  2. HH signifie qu’il y a deux objets de type H 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.

Attention
La longueur des données représentées par la chaîne de format doit être la même que celle des données données données, sinon elle signale une erreur.
>>> 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().

Info
La représentation des octets sera convertie en un entier

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
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - Python Bytes