2011-09-26 4 views
21

Ho bisogno di creare un frame tcp con dati binari grezzi, ma tutti gli esempi e le esercitazioni che ho trovato parlando di byte implicano sempre la conversione da una stringa, e non è quello che mi serve.Python 3 Creazione di una matrice di byte

In breve, ho bisogno di costruire solo un array di byte:

0xA2 0x01 0x02 0x03 0x04

prega di notare che io vengo da C/C++ mondo.

Ho provato questo:

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)) 

Poi, gettare questa variabile frame da inviare modalità di presa, ma non funziona come ci si aspetta da cornice non contiene quello che voglio ...

So che questa è una domanda molto basilare su Python, quindi se potessi indicarmi la giusta direzione ...

+3

Il problema con il codice precedente è che "byte" si comporta in modo molto diverso se viene fornito un numero intero anziché un elenco. Dovresti usare 'frame + = bytes ([int ('0xa2', 16)])'. –

+0

So che vuoi (ed) farlo dinamicamente, ma ciò che non è completamente chiaro è questo: da dove provengono i byte di input? Leggi la notazione esadecimale da un file di testo? Scrivi ogni byte nel codice sorgente? Li hai in un bytearray che hai ottenuto leggendo il binario dallo stdin? –

risposta

27

Utilizzare un 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') 

o, utilizzando il codice, ma correggere gli errori:

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

hai aggiunto il tag bytearray alla domanda quando la risposta potrebbe non usarlo come soluzione. –

+0

@clinisbut È ancora correlato - nel senso generale, si sta utilizzando un array di byte (il concetto) anche se non si utilizza il tipo 'bytearray'. Uno dei due metodi nella mia risposta dovrebbe risolvere il tuo problema. – agf

+0

puoi sostituire 'bytearray'with' bytes' e ottenere più o meno lo stesso risultato. un 'bytearray' è comunque un tipo mutevole, quindi potrebbe essere più utile di un' bytes' per costruire i frame. –

0

Penso che Scapy sia quello che stai cercando.

http://www.secdev.org/projects/scapy/

si può costruire e inviare frame (pacchetti) con esso

+1

Grazie, ma sono più interessato a imparare come farlo;) –

+0

Bene, lo Scapy è solo uno strumento utile per i progetti generali di rete e di pacchetti. Penso che quello che stai cercando sia qualcosa del genere: > >>> da struct import * > >>>>>> packet = pack ('Bbbbb', 162,1,2,3,4,) > >>> pacchetto > '\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

Non mi creda, voglio risolvere il mio problema con Python. –

10

che dire semplicemente costruendo il tuo telaio da uno sta Lista ndard?

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

costruttore bytes() può costruire un frame byte da un iterabile contenente int valori. un iterabile è tutto ciò che implementa il protocollo iteratore: un elenco, un iteratore, un oggetto iterabile come quello che viene restituito dalla range() ...

6
frame = b'\xa2\x01\x02\x03\x04' 

non era menzionate fino ad ora ... ByteArray

+0

ma ho bisogno di creare dinamicamente il frame –

+1

questa sintassi per la costruzione di una matrice di byte funziona come per un tipo di stringa: è possibile utilizzare '+' o altri operatori simili per creare dinamicamente l'array di byte. –