2011-11-02 21 views
8

Tengo un archivo binario que estoy leyendo, donde algunos valores de 2 bytes se almacenan en orden de bytes "invertidos" (little endian?), Por ejemplo.Cómo cambiar el orden de los bytes de los datos binarios

1D 00 13 00 27 00 3B 00 45 00 31 00 4F 

El programa original que creó estos valores los almacena internamente como cortos. Esos valores deberían corresponder a: 29, 19, 39, 59, 69, 49, 79. Estoy tratando de leer estos valores usando Python 2.6.5 (aunque esto probablemente se ejecutará en sistemas mucho más antiguos, por ejemplo, 2.3 y 2.4) .

He intentado usar

val1, val2, val3, val4, val5, val6, val7 = struct.unpack("1h 1h 1h 1h 1h 1h 1h", data) 

y, por supuesto, los valores salir todo mal:

7427 
4864 
9984 
15104 
17664 
12544 
20224 

Después de buscar en la documentación de estructura, pensé que sería capaz usar algo como

val1, ... = struct.unpack("!h !h ... 

pero cuando las pruebas, sólo tengo

struct.error: bad char in struct format 

¿Cómo puedo descomprimir estos valores con el orden de bytes correcto? ¿Estoy atascado leyendo los dos bytes por separado y luego volviéndolos a ensamblar en el código python?

Respuesta

9

El orden de bytes se especifica con un solo carácter, al comienzo de la cadena de formato.

values = struct.unpack('!7h', data) 
+0

Aha, eso fue todo. Tengo varios especificadores de formato en la cadena de formato, pero solo coloque el carácter de orden byte delante del especificador 'h' en lugar de al comienzo de toda la cadena. ¡Gracias! – pfyon

3

¿Qué tal

>>> a='\x1d\x00\x13\x00\x27\x00\x3b\x00\x45\x00\x31\x00\x4f\x00'

>>> struct.unpack('<%dH' % (len(a)/2), a)

(29, 19, 39, 59, 69, 49, 79)?

De acuerdo con la documentación struct parece que necesita usar < para especificar little-endian.

0

He resuelto un problema similar de orden de bytes invertidos utilizando a.byteswap(True), pero no estoy seguro de si este es el método más eficiente.

Cuestiones relacionadas