Dato un file con dati binari compressi per la risoluzione, vorrei convertire i bit sub-byte nelle loro rappresentazioni integer in python. Con questo voglio dire che ho bisogno di interpretare n
bit da un file come numero intero.Il modo più veloce per decomprimere i bit (sotto byte) dei numeri dal file
Attualmente sto leggendo il file negli oggetti bitarray
e sto convertendo sottoinsiemi degli oggetti in numeri interi. Il processo funziona ma è abbastanza lento e macchinoso. C'è un modo migliore per farlo, forse con il modulo struct
?
import bitarray
bits = bitarray.bitarray()
with open('/dir/to/any/file.dat','r') as f:
bits.fromfile(f,2) # read 2 bytes into the bitarray
## bits 0:4 represent a field
field1 = int(bits[0:4].to01(), 2) # Converts to a string of 0s and 1s, then int()s the string
## bits 5:7 represent a field
field2 = int(bits[4:7].to01(), 2)
## bits 8:16 represent a field
field3 = int(bits[7:16].to01(), 2)
print """All bits: {bits}\n\tfield1: {b1}={field1}\n\tfield2: {b2}={field2}\n\tfield3: {b3}={field3}""".format(
bits=bits, b1=bits[0:4].to01(), field1=field1,
b2=bits[4:7].to01(), field2=field2,
b3=bits[7:16].to01(), field3=field3)
Uscite:
All bits: bitarray('0000100110000000')
field1: 0000=0
field2: 100=4
field3: 110000000=384
Le dimensioni del campo si ripetono mentre si passa attraverso il file o sono completamente casuali? Attraversano i confini dei byte? –
1. I campi attraversano i contorni dei byte. 2. I campi si ripetono, ma c'è un chunk di dimensioni sconosciute che deve essere letto dinamicamente. OSSIA nel mio esempio, puoi dire che 'field3' mi dice quanto deve essere grande' field4'. Quindi il file ripete 'field1',' field2' ecc. –
è la dimensione di field4 in byte o bit? Dev'essere tutto in un numero intero? – TisteAndii