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
- Conversion d’octets en entiers dans Python 2.7
- Python 3 et le type
bytes
- Conversion d’octets en entiers dans Python 3
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.