Manipuler des données binaires
bytes() : construire une séquence d'octets immuable
print(bytes([65, 66, 67])) # b'ABC'
print(bytes("été", "utf-8")) # b'\xc3\xa9t\xc3\xa9'
print(bytes(3)) # b'\x00\x00\x00'
Chaque octet a une valeur comprise entre 0 et 255. Un texte exige un encodage ; un entier indique une longueur de séquence initialisée à zéro.
Equivalent en C#
byte[] data = { 65, 66, 67 };
byte[] encoded = Encoding.UTF8.GetBytes("été");
ReadOnlyMemory<byte> view = data;
Console.WriteLine(Encoding.UTF8.GetString(view.Span)); // ABC
byte[] est mutable et correspond davantage à bytearray. ReadOnlyMemory<byte> et ReadOnlySpan<byte> interdisent l’écriture par la vue, mais ne rendent pas immuable le tableau partagé. Il n’existe donc pas ici de correspondance exacte avec l’immuabilité de bytes.
bytearray() : construire une séquence d'octets mutable
Equivalent en C#
byte[] data = Encoding.ASCII.GetBytes("ABC");
data[0] = 90;
Console.WriteLine(Encoding.ASCII.GetString(data)); // ZBC
Un tableau .NET possède une longueur fixe. bytearray peut aussi changer de taille ; List<byte> est un autre rapprochement lorsque cette capacité est nécessaire.
memoryview() : accéder à un tampon sans copie initiale
memoryview() crée une vue sur les données d'un objet qui expose le protocole tampon. La possibilité d'écrire dépend du tampon sous-jacent.
data = bytearray(b"ABC")
view = memoryview(data)
view[0] = 90
print(data) # bytearray(b'ZBC')
view.release()
Cette fonction est utile pour traiter des données binaires en limitant les copies.
Equivalent en C#
byte[] data = Encoding.ASCII.GetBytes("ABC");
Span<byte> view = data.AsSpan();
view[0] = 90;
Console.WriteLine(Encoding.ASCII.GetString(data)); // ZBC
Span<T> représente une vue sans copie avec des contraintes de durée de vie. Memory<T> peut être conservé dans un objet et traverser certaines frontières asynchrones. Ces types ne reproduisent pas toutes les possibilités de forme et de format de memoryview.