web-dev-qa-db-fra.com

Comment diviser une chaîne d'octets en octets séparés en python

Ok, donc j’utilise Python pour essayer de créer une image de forme d’onde et j’obtiens les données brutes du fichier .wav en utilisant song = wave.open() et song.readframes(1), ce qui retourne:

b'\x00\x00\x00\x00\x00\x00'

Ce que je veux savoir, c'est comment je l'ai divisé en trois octets distincts, par exemple. b'\x00\x00', b'\x00\x00', b'\x00\x00' car chaque image a une largeur de 3 octets. J'ai donc besoin de la valeur de chaque octet pour pouvoir créer une forme d'onde. Je crois que c'est comme ça que je dois le faire quand même.

13
Razzad777

Vous pouvez utiliser le découpage sur des objets byte:

>>> value = b'\x00\x01\x00\x02\x00\x03'
>>> value[:2]
b'\x00\x01'
>>> value[2:4]
b'\x00\x02'
>>> value[-2:]
b'\x00\x03'

Cependant, lorsque vous manipulez ces cadres, vous voudrez probablement aussi connaître les objets memoryview() ; ceux-ci vous permettent d'interpréter les octets comme des types de données C sans aucun travail supplémentaire de votre part, simplement en créant une vue sur les octets sous-jacents:

>>> mv = memoryview(value).cast('H')
>>> mv[0], mv[1], mv[2]
256, 512, 768

L'objet mv est maintenant une vue de la mémoire interprétant tous les 2 octets comme un raccourci non signé; il a donc maintenant une longueur de 3 et chaque index est un entier, basé sur les octets sous-jacents. 

23
Martijn Pieters

Voici un moyen de diviser les octets en une liste: 

data = b'\x00\x00\x00\x00\x00\x00'
info = [data[i:i+2] for i in range(0, len(data), 2)]
print info

donne le résultat:

['\x00\x00', '\x00\x00', '\x00\x00']
11
kyle k
data = b'\x00\x00\x00\x00\x00\x00'
info = [data[i:i+2] for i in range(0, len(data), 2)]
print info

Où puis-je en savoir plus sur la ligne suivante?

info = [data[i:i+2] for i in range(0, len(data), 2)]

Je ne comprends pas data[i:i+2]

0
E. Pashov