使用 Python(3.1 或 2.6),我正在尝试从 GPS 接收器生成的二进制数据文件中读取数据。每小时的数据存储在一个单独的文件中,每个文件大约 18 MiB。数据文件有多个可变长度记录,但现在我只需要从其中一个记录中提取数据。
我已经能够在某种程度上解码标题。我之所以这么说,是因为有些数字没有意义,但大多数都有。在这上面花了几天(我已经开始学习使用 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 是 x44 的 ascii 等效值 - 我假设。)
我正在寻找的记录 ID 是 274 - 这似乎是正确的。
GPS 周返回为 1573 - 这似乎是正确的。
毫秒返回为 126060000 - 我期待 126015000。
如何查找标识为 274 的记录并提取它们?(我正在学习 Python 和编程,所以请记住,您给经验丰富的编码员的答案可能会让我难以理解。)