web-dev-qa-db-fra.com

Python 3 Construire un tableau d'octets

J'ai besoin de construire un cadre TCP avec des données binaires brutes, mais tous les exemples et tutoriels que j'ai trouvés parlent toujours d'octets impliquent toujours la conversion d'une chaîne, et ce n'est pas ce dont j'ai besoin.

En bref, je n'ai besoin que de construire un tableau d'octets:

0xA2 0x01 0x02 0x03 0x04

Veuillez noter que je viens du monde C/C++.

J'ai essayé ceci:

frame = b""
frame += bytes( int('0xA2',16) )
frame += bytes( int('0x01',16) )
frame += bytes( int('0x02',16) )
frame += bytes( int('0x03',16) )
frame += bytes( int('0x04',16) )

Ensuite, jetez cette variable de cadre pour envoyer la méthode de socket, mais ne fonctionne pas comme prévu car le cadre ne contient pas ce que je veux ...

Je sais que cette question est très élémentaire à propos de Python, alors si vous pouviez me diriger dans la bonne direction ...

31
Raúl Ferràs

Utilisez une bytearray :

>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'\xa2\x01\x02\x03\x04')

ou, en utilisant votre code mais en corrigeant les erreurs:

frame = b""
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03'
frame += b'\x04'
42
agf

qu'en est-il de simplement construire votre cadre à partir d'une liste standard?

frame = bytes([0xA2,0x01,0x02,0x03,0x04])

le constructeur bytes() peut créer un cadre d'octet à partir d'une variable itérative contenant des valeurs int. un itérable est tout ce qui implémente le protocole itérateur: une liste, un itérateur, un objet itérable comme celui retourné par range()...

13
Adrien Plisson
frame = b'\xa2\x01\x02\x03\x04'

n'a pas été mentionné jusqu'à maintenant ...

6
glglgl

la solution bytearray d’agf est réalisable, mais si vous vous trouvez dans l’obligation de créer des paquets plus complexes en utilisant des types de données autres que les octets, vous pouvez essayer struct.pack(). http://docs.python.org/release/3.1.3/library/struct.html

3
Russell Borogove

Voici une solution pour obtenir un tableau d'octets (liste):

J'ai trouvé qu'il fallait d'abord convertir l'Int en octet avant de le transmettre à bytes ():

bytes(int('0xA2', 16).to_bytes(1, "big"))

Puis créez une liste à partir des octets:

list(frame)

Donc, votre code devrait ressembler à:

frame = b""
frame += bytes(int('0xA2', 16).to_bytes(1, "big"))
frame += bytes(int('0x01', 16).to_bytes(1, "big"))
frame += bytes(int('0x02', 16).to_bytes(1, "big"))
frame += bytes(int('0x03', 16).to_bytes(1, "big"))
frame += bytes(int('0x04', 16).to_bytes(1, "big"))
bytesList = list(frame)

La question était pour un tableau (liste) d'octets. Vous avez accepté une réponse qui ne dit pas comment obtenir une liste, je ne suis donc pas sûr que ce soit ce dont vous aviez besoin.

0
King Tech