Pregunta

Estoy abriendo un archivo binario de este modo:

file = open("test/test.x", 'rb')

y la lectura en líneas a una lista. Cada línea se ve un poco como:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'

Estoy teniendo un tiempo difícil la manipulación de estos datos. Si trato e imprimir cada línea, Python se congela, y emite pitidos ruidos (Creo que hay un código de sonido binario en alguna parte). ¿Cómo hago para usar estos datos de manera segura? ¿Cómo puedo convertir cada número hexadecimal a decimal?

¿Fue útil?

Solución

Para imprimir, se puede hacer algo como esto:

print repr(data)

Por todo como hex:

print data.encode('hex')

Para obtener el valor decimal de cada byte:

print ' '.join([str(ord(a)) for a in data])

Para enteros binarios de desempaquetado, etc., de los datos como si originalmente provenía de una estructura de estilo C, vistazo a la struct módulo.

Otros consejos

\xhh es el carácter con el valor hexadecimal hh . Otros personajes como . y ~' son caracteres `normales.

iteración en una cadena que da a los personajes en él, uno a la vez.

ord(c) devolverá un entero que representa el carácter. Eg, ord('A') == 65.

Esto imprimirá los números decimales para cada personaje:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)

Como se mencionó theatrus, ord y hex podría ayudarle. Si desea tratar de interpretar algún tipo de datos binarios estructurados en el archivo, el struct módulo podría ser útil.

datos

binario rara vez se divide en "líneas" separadas por '\ n'. Si lo es, tendrá un mecanismo de escape implícita o explícita para distinguir entre '\ n' como un terminador de línea y '\ n' como parte de los datos. La lectura de un archivo, tales como líneas ciegas sin conocimiento del mecanismo de escape no tiene sentido.

Para responder a sus preocupaciones específicas:

'\ x07' es el carácter ASCII BEL, que era originalmente para hacer sonar la campana en una máquina de teletipo.

Usted puede obtener el valor entero de un byte 'b' al hacer ord(b).

Sin embargo, para procesar datos binarios correctamente, es necesario saber qué es el diseño . Puede haber firmado y enteros sin signo (de tamaños 1, 2, 4, 8 bytes), los números de punto, números decimales de longitud variable, cadenas de longitud fija, cadenas de longitud variable, etc, etc Agregado complicación proviene de si los datos se graban flotantes en la moda o la moda bigEndian littleEndian. Una vez que sepa todo lo anterior (o tienen muy buenas conjeturas informadas), el Python módulo struct debe ser capaz de ser utilizado para la totalidad o la mayor parte de su procesamiento; la ctypes módulo también pueden ser útiles.

¿El formato de datos tiene un nombre? Si es así, nos dicen; podemos ser capaces de señalar a código o documentos.

Usted pregunta "¿Cómo hago para usar estos datos de manera segura?" lo que plantea la pregunta: ¿Qué desea utilizarlo para? Lo manipulaciones qué quiere hacer?

Está intentando imprimir los datos convertidos en caracteres ASCII, que no va a funcionar.

Se puede usar con seguridad cualquier byte de los datos. Si desea imprimir como un hexadecimal, mirar las funciones ord y hex /

¿Está utilizando read() o readline()? Usted debe utilizar para leer read(n) n bytes; readline() leerá hasta que se realiza un salto de línea, que el archivo binario podría no tener.

En cualquier caso, sin embargo, se le devuelve una cadena de bytes, que puede ser caracteres imprimibles o no imprimibles, y probablemente no es muy útil.

Lo que queremos es ord(), que convierte una cadena de un byte en el valor entero correspondiente. read() desde el un byte archivo a la ord() tiempo y llamada en el resultado, o se puede recorrer toda la cadena.

Si usted está dispuesto a utilizar NumPy y flujo de bits , puede hacerlo

>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
         7, 190,   3, 222,   7, 254,  10], dtype=uint8)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top