bytes
/ bytearray
/ memoryview
, struct
¶
Par Marc Schnaebele 1
bytes
¶
Le type bytes
fait partie des types dits de séquence. Il permet de traiter les chaines d’octets.
Instanciation¶
syntaxe
bytes([initializer[, encoding]])
exemple
"""Module d'exemple d'instanciation d'un bytes."""
msg = bytes('exemple', encoding='utf-8')
# On peut aussi affecter une chaine directement
# mais l'encodage par défaut sera utilisé.
msg = b"exemple$"
opérations¶
Cast bytes <–> str
"""Module d'exemple de cast entre un bytes et un string."""
# Cast string en bytes.
my_str = "exemple"
bytes = str.encode(my_str)
# Cast bytes en string.
my_decoded_str = str.decode(bytes)
type(my_decoded_str) # vérifie que le type est string
Cast int <–> bytes
"""Module d'exemple de cast entre un bytes et un int."""
i = 16
# Crée 1 byte avec un int 16.
# Attention à utiliser le bon encodage (little ou big endian).
# vérifiez avec sys.byteorder.
single_byte = i.to_bytes(1, byteorder='big', signed=True)
print(single_byte)
# Crée un bytes avec une liste de int (0-255).
# sortie: b'\xff\xfe\xfd\xfc.
bytes_from_list = bytes([255, 254, 253, 252])
# Print out binary string (e.g. 0b010010).
print(bin(22))
# Bytes à Integer.
# Crée un int avec un bytes (non signé par défaut).
i = int.from_bytes('12', byteorder='big')
# Crée un int signé.
i = int.from_bytes(b'\x00\x0F', byteorder='big', signed=True)
# Utilise une liste d'entiers comme source pour le cast.
i = int.from_bytes([255, 0, 0, 0], byteorder='big')
Un tableau résumant les opérations standards sur les bytes se trouve sur la documentation officielle des Built-in Types.
bytearray
¶
Le type bytearray
est un tableau de bytes
et contient donc un objet bytes dans chaque clé.
Il n’y a donc pas de différence un bytarray
est une collection de bytes
.
Instanciation¶
bytearray([initializer[, encoding]])
exemple
"""Module d'exemple d'instanciation un bytearray."""
# Crée un bytearray à partir d'un objet bytes.
msg = bytearray(b"exemple")
# Crée un bytearray à partir d'une chaine de caractères.
msg = bytearray("exemple", "utf-8")
# Crée un bytearray à partir d'une liste d'entiers entre 0 et 255.
msg = bytearray([94, 91, 101, 125, 111, 35, 120, 101, 115, 101, 200])
# hexadécimal.
0xff # sortie 255.
# binaire.
0b100 # sortie 4.
# autres possibilitées.
"{:x}".format(int.from_bytes("exemple".encode("utf-8"), byteorder="big"))
# sortie '6578656d706c65'.
# 65 est la lettre 'e' en hexadécimal.
f"{ord('e'):x}" # sortie '65'.
Opérations¶
En plus des opérations, ci-dessous voir les opérations de bytes ci-dessus.
"""Module d'exemple de cast entre bytes et bytearray."""
# Cast bytes à bytearray.
mutable_bytes = bytearray(b'\x00\x0F')
# Cast bytearray à bytes.
immutable_bytes = bytes(mutable_bytes)
memoryview
¶
Une memoryview
est un objet permettant d’utiliser des buffers afin de pouvoir les manipuler comme tout autre objet Python.
Instanciation¶
"""Module d'exemple d'instanciation d'une memoryview."""
# Crée une memoryview à partir d'un objet byte.
mv = memoryview(b'exemple')
Opérations¶
"""Module d'exemple des opérations avec une memoryview."""
# retourne les données comme string de bytes.
# sortie: b'abc'.
mv = memoryview(b"abc")
mv.tobytes()
# retourne les données en hexadécimale.
# sortie: '616263'.
mv = memoryview(b"abc")
mv.hex()
# retourne les données en une lsite d'élements.
# sortie: [97, 98, 99].
memoryview(b'abc').tolist()
# relacher le buffer.
mv.release()
Plus d’opérations sur les memoryview dans la documentation des Built-in Types.
Exemple d’utilisation¶
"""Module d'exemple d'une memoryview."""
buf = bytearray(b'abcdefgh')
mv = memoryview(buf)
mv[4:6] = b'ZA'
buf
# sortie bytearray(b'abcdZAgh')
Avec bytearray:
"""Module d'exemple d'une memoryview avec un bytearray."""
# Avec bytearray.
buf = bytearray(b'abcdefgh')
mv = memoryview(buf)
mv[4:6] = b'ZA'
buf
bytearray(b'abcdZAgh')
struct
¶
Un struct
permet de convertir des structures C en valeurs Python représenté sous forme d’objets bytes. Ceux-ci sont utilisés pour manipuler des données binaire depuis des fichiers, le réseau ou d’autres sources.
Exemple d’utilisation¶
"""Module d'exemple struct."""
from collections import namedtuple
from struct import pack, unpack
# packing et unpacking de trois entiers.
pack('hhl', 1, 2, 3)
# sortie : '\x00\x01\x00\x02\x00\x00\x00\x03'
unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
# sortie : (1, 2, 3)
# On peut assigner des noms aux champs.
record = 'raymond \x32\x12\x08\x01\x08'
name, serialnum, school, gradelevel = unpack('<10sHHb', record)
Student = namedtuple('Student', 'name serialnum school gradelevel')
Student._make(unpack('<10sHHb', record))
Student(name='raymond ', serialnum=4658, school=264, gradelevel=8)
Plus d’informations sur les methodes et caractéristiques des struct
. se trouve sur la documentation officielle.
Sources¶
http://stackoverflow.com/questions/16678363/python-3-how-do-i-declare-an-empty-bytes-variable
http://stackoverflow.com/questions/19511440/add-b-prefix-to-python-variable
http://www.devdungeon.com/content/working-binary-data-python
http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3
https://docs.python.org/3/library/stdtypes.html?highlight=memoryview#memoryview
https://docs.python.org/3.6/library/struct.html#module-struct
https://docs.python.org/2/library/struct.html
http://stackoverflow.com/questions/35988/c-like-structures-in-python