Используя Python (3.1 или 2.6), я пытаюсь прочитать данные из двоичных файлов данных, созданных приемником GPS. Данные за каждый час хранятся в отдельном файле, каждый из которых составляет около 18 МиБ. Файлы данных имеют несколько записей переменной длины, но сейчас мне нужно извлечь данные только из одной из записей.
У меня есть возможность немного расшифровать заголовок. Я говорю несколько, потому что некоторые цифры не имеют смысла, но большинство из них. Потратив на это несколько дней (я начал учиться программировать на Python), я не добился прогресса, поэтому пришло время обратиться за помощью.
Справочное руководство дает мне структуру заголовка сообщения и структуру записи. Заголовки могут быть переменной длины, но обычно составляют 28 байтов.
Header
Field # Field Name Field Type Desc Bytes Offset
1 Sync char Hex 0xAA 1 0
2 Sync char Hex 0x44 1 1
3 Sync char Hex 0x12 1 2
4 Header Lgth uchar Length of header 1 3
5 Message ID ushort Message ID of log 2 4
8 Message Lgth ushort length of message 2 8
11 Time Status enum Quality of GPS time 1 13
12 Week ushort GPS week number 2 14
13 Milliseconds GPSec Time in ms 4 16
Record
Field # Data Bytes Format Units Offset
1 Header 0
2 Number of SV Observations 4 integer n/a H
*For first SV Observation*
3 PRN 4 integer n/a H+4
4 SV Azimuth angle 4 float degrees H+8
5 SV Elevation angle 4 float degrees H+12
6 C/N0 8 double db-Hz H+16
7 Total S4 8 double n/a H+24
...
27 L2 C/N0 8 double db-Hz H+148
28 *For next SV Observation*
SV Observation is satellite - there could be anywhere from 8 to 13
in view.
Вот мой код для понимания заголовка:
import struct
filename = "100301_110000.nvd"
f = open(filename, "rb")
s = f.read(28)
x, y, z, lgth, msg_id, mtype, port, mlgth, seq, idletime, timestatus, week, millis, recstatus, reserved, version = struct.unpack("<cccBHcBHHBcHLLHH", s)
print(x, y, z, lgth, msg_id, mtype, port, mlgth, seq, idletime, timestatus, week, millis, recstatus, reserved, version)
Выводит:
b'\xaa' b'D' b'\x12' 28 274 b'\x02' 32 1524 0 78 b'\xa0' 1573 126060000 10485760 3545 35358
3 поля синхронизации должны возвращать xAA x44 x12. (D является эквивалентом Ascii x44 - я полагаю.)
Идентификатор записи, которую я ищу, - 274 - это кажется правильным.
Неделя GPS возвращается как 1573 - кажется правильным.
Миллисекунды возвращаются как 126060000 - я ожидал 126015000.
Как мне найти записи, идентифицированные как 274, и извлечь их? (Я изучаю Python и программирую, поэтому имейте в виду, что ответ, который вы дадите опытному программисту, может быть у меня над головой.)