Biorąc pod uwagę plik z danymi binarnymi skompresowanymi do rozdzielczości, chciałbym przekonwertować bity sub-bajtowe na ich reprezentacje liczb całkowitych w pythonie. Rozumiem przez to, że muszę interpretować bity n
z pliku jako liczbę całkowitą.Najszybszy sposób rozpakowywania bitów (sub-bajtów) z pliku
Obecnie czytam plik w obiektach bitarray
i konwertuję podzbiory obiektów na liczby całkowite. Proces działa, ale jest dość powolny i uciążliwy. Czy istnieje lepszy sposób, aby to zrobić, być może z modułem 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)
Wyjścia:
All bits: bitarray('0000100110000000')
field1: 0000=0
field2: 100=4
field3: 110000000=384
Czy wielkości pól powtarzają się podczas przeglądania pliku, czy są całkowicie losowe? Czy przekraczają granice bajtów? –
1. Pola przekraczają granice bajtów. 2. Pola powtarzają się, ale istnieje nieznany fragment, który należy odczytać dynamicznie. TO ZNACZY. w moim przykładzie możesz powiedzieć, że 'field3' mówi mi, jak duże' field4' musi być. Następnie plik powtarza 'field1',' field2' itd. –
to rozmiar pola4 w bajtach lub bitach? Czy to wszystko musi pasować do liczby całkowitej? – TisteAndii