2011-09-26 20 views
21

Necesito construir un marco tcp con datos binarios en bruto, pero todos los ejemplos y tutoriales que he encontrado hablando de bytes siempre implican la conversión de una cadena, y eso no es lo que necesito.Python 3 Creando una matriz de bytes

En resumen, tengo que construir solo una matriz de bytes:

0xA2 0x01 0x02 0x03 0x04

Tenga en cuenta que vengo de C/C++ mundo.

He intentado esto:

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

A continuación, tirar marco de esta variable para enviar método de toma, pero no funciona como se esperaba como trama no contiene solo lo que quiero ...

Sé que esta es una pregunta muy básica sobre Python, así que si me pueden señalar en la dirección correcta ...

+3

El problema con el código anterior es que 'bytes' se comporta de manera muy diferente si se le da un número entero en lugar de una lista. Debería usar 'frame + = bytes ([int ('0xa2', 16)])'. –

+0

Sé que quiere (ed) hacer esto de forma dinámica, pero lo que no está del todo claro es esto: ¿de dónde vienen los bytes de entrada? ¿Lees la notación hexadecimal desde un archivo de texto? ¿Escribes cada byte en el código fuente? ¿Los tienes en un bytearray que obtuviste leyendo binary de stdin? –

Respuesta

27

Utilice 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, utilizando su código, pero que fijan los errores:

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

agregaste la etiqueta bytearray a la pregunta cuando la respuesta puede no usarlo como solución. –

+0

@clinisbut Todavía está relacionado, en el sentido general, estás usando una matriz de bytes (el concepto) incluso si no estás utilizando el tipo 'bytearray'. Cualquiera de los dos métodos en mi respuesta debería resolver su problema. – agf

+0

puede reemplazar 'bytearray' con' bytes' y obtener aproximadamente el mismo resultado. sin embargo, un 'bytearray' es un tipo mutable, por lo que puede ser más útil que un' bytes' para construir sus cuadros. –

0

Creo que Scapy es lo que estás buscando.

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

puede crear y enviar tramas (paquetes) con ella

+1

Gracias, pero estoy más interesado en aprender cómo hacerlo;) –

+0

Bueno, Scapy es simplemente una buena herramienta para proyectos de redes y paquetes en general. Creo que lo que estás buscando es algo como esto: > >>> desde struct import * > >>>>>> paquete = paquete ('Bbbbb', 162,1,2,3,4,) > >>> paquete > '\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

No, créame, quiero resolver mi problema con Python. –

10

¿qué hay de simplemente construir su marco de un sta ndard list?

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

la bytes() constructor puede construir un marco de bytes de un iterable que contiene int valores. un iterable es cualquier cosa que implementa el protocolo de iteración: una lista, un iterador, un objeto iterable como lo que es devuelto por range() ...

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

no fue mencionado hasta ahora ... bytearray

+0

pero necesito construir el marco de forma dinámica –

+1

esta sintaxis para construir una matriz de bytes funciona igual que para un tipo de cadena: puede usar '+' u otros operadores similares para construir dinámicamente su matriz de bytes. –

Cuestiones relacionadas