Как мне прочитать из двоичного файла в массиве int16 в Python - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь проанализировать двоичный файл.файл содержит несколько пакетов данных, каждый из которых начинается с метки времени, а затем определяется массив (строки и столбцы каждый int32) самого массива.Я начал с попытки разбора одного пакета, но у меня проблема с чтением массива:

tsSize = 8
rowSize = 4
columnSize=4
thresholdVectorSize=4
targetsCandidatesVectorSize=4
centerOfMassVectorSize=4
bytesReadUpToNow=0
with open("C:\\outputs\\out.bin", mode='rb') as file: # b is important -> binary
    fileContent = file.read()   
    TimeS = struct.unpack("Q", fileContent[bytesReadUpToNow:bytesReadUpToNow+tsSize])[0]
    bytesReadUpToNow+=tsSize
    dt =datetime.datetime.fromtimestamp(TimeS/1000.0)
    rows, columns = struct.unpack("ii", fileContent[bytesReadUpToNow:bytesReadUpToNow+rowSize+columnSize])
    bytesReadUpToNow=bytesReadUpToNow+rowSize+columnSize
    data = struct.unpack("h" * (rows*columns), fileContent[bytesReadUpToNow:rows*columns*2+bytesReadUpToNow])[0]
    print(sys.getsizeof(data))
    print(type(data))

Есть ли способ предопределенного размера массива в python?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать «bytearray»:

ba=bytearray(1000)      # zero-filled                                                 

In:  sys.getsizeof(ba)                                                       
Out: 1057

In:  ba[0:10]                                                                
Out: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

In:  ba[5]=255                                                              

In:  ba[0:10]                                                               
Out: bytearray(b'\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00')

Редактировать:

with open("data","wb") as ff: 
     ff.write(int.to_bytes(100,1,"big")) 
     ff.write(int.to_bytes(300,2,"big")) 
     ff.write(int.to_bytes(5001,4,"big")) 

ba=bytearray(7)
ba
Out: bytearray(b'\x00\x00\x00\x00\x00\x00\x00')

with open("data","rb") as ff: 
     ba[0:7]= ff.read(7) 

ba                                          
Out: bytearray(b'd\x01,\x00\x00\x13\x89')

int.from_bytes(ba[0:1],"big")
Out: 100

int.from_bytes(ba[1:3],"big")
Out: 300

int.from_bytes(ba[3:],"big") 
Out: 5001
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...