Python Programming

Conversion d’octets en entiers en Python 2.7 et 3

Spread the love

Le traitement des octets dans Python diffère significativement entre Python 2.7 et Python 3. Cet article clarifie comment convertir des octets en entiers dans les deux versions, en soulignant les distinctions cruciales.

Table des matières

Python 2.7 et les chaînes d’octets

Dans Python 2.7, le type str gère à la fois les données textuelles et les données octets. Un type bytes dédié, comme on le trouve dans Python 3, est absent. Les chaînes d’octets sont essentiellement des séquences de caractères représentant des valeurs d’octets. Il est important de se rappeler que Python 2.7 est officiellement déprécié et ne doit pas être utilisé pour de nouveaux projets.

Conversion d’octets en entiers dans Python 2.7

La conversion d’octets simples en entiers se fait avec la fonction ord() :


byte_string = 'A'  # Représente la valeur octet de 'A'
integer_value = ord(byte_string)
print(integer_value)  # Sortie : 65

ord() fournit le point de code Unicode, qui correspond à la valeur numérique de l’octet pour les octets simples. Pour les chaînes d’octets plus longues, une manipulation des bits est nécessaire pour les convertir en entiers plus grands. L’exemple suivant suppose un ordre d’octets little-endian :


byte_string = 'x01x02x03' # Exemple de chaîne d'octets (little-endian)
integer_value = 0
for byte in byte_string:
    integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # Sortie : 66051

Ceci décale itérativement l’entier vers la gauche de 8 bits et applique un OU bit à bit pour incorporer chaque octet. Pour l’ordre big-endian, inverser l’itération.

Python 3 et le type bytes

Python 3 introduit explicitement le type bytes, le séparant du type str (texte Unicode). Les objets bytes sont des séquences immuables d’entiers allant de 0 à 255.

Conversion d’octets en entiers dans Python 3

Python 3 offre une approche plus propre. Pour un seul octet :


byte_data = b'x41' # Notez le préfixe 'b' indiquant un littéral octet
integer_value = byte_data[0]
print(integer_value)  # Sortie : 65

L’accès direct à l’octet à l’index 0 donne la valeur entière. Pour plusieurs octets, int.from_bytes() est utilisé, en spécifiant l’ordre des octets (endianness) :


byte_data = b'x01x02x03' # Exemple little-endian
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value)  # Sortie : 66051

byte_data = b'x01x02x03' # Exemple big-endian
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value)  # Sortie : 16909060

byteorder='little' signifie que l’octet le moins significatif est en premier, tandis que byteorder='big' indique que l’octet le plus significatif est en premier. Spécifiez toujours byteorder pour la portabilité ; sinon, la valeur par défaut du système est utilisée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *