2011-11-02 17 views
8

Ho un file binario che sto leggendo dove alcuni valori di 2 byte sono memorizzati nell'ordine dei byte 'reverse' (little endian?), Ad es.Come cambiare l'ordine dei byte dei dati binari

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

Il programma originale che ha creato questi valori li memorizza internamente come corti. Questi valori dovrebbero corrispondere a: 29, 19, 39, 59, 69, 49, 79. Sto provando a leggere questi valori usando python 2.6.5 (anche se questo probabilmente sarà eseguito su sistemi molto più vecchi, ad esempio 2.3 e 2.4) .

Ho provato con

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

e, naturalmente, i valori di tutti escono sbagliato:

7427 
4864 
9984 
15104 
17664 
12544 
20224 

Dopo aver guardato la documentazione per struct, ho pensato che sarebbe in grado usare qualcosa come

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

ma quando i test, ho ottenuto solo

struct.error: bad char in struct format 

Come posso decomprimere questi valori con l'ordine dei byte corretto? Sono bloccato a leggere i due byte separatamente, quindi li riassemblo nel codice Python?

risposta

9

L'ordine dei byte viene specificato con un singolo carattere, all'inizio della stringa di formato.

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

Aha, era così. Ho molti specificatori di formato nella stringa di formato, ma ho inserito il carattere di ordine byte davanti allo specificatore 'h' invece che all'inizio dell'intera stringa. Grazie! – pfyon

3

Come su

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

Secondo la documentazione struct sembra che sia necessario utilizzare < per specificare little-endian.

0

Ho risolto un problema simile di ordine di byte invertito utilizzando a.byteswap(True), ma non sono sicuro se questo è il metodo più efficiente.