Python (3.1 または 2.6) を使用して、GPS 受信機によって生成されたバイナリ データ ファイルからデータを読み取ろうとしています。1 時間ごとのデータは個別のファイルに保存され、それぞれのファイルは約 18 MiB です。データ ファイルには複数の可変長レコードがありますが、ここではそのうちの 1 つのレコードからデータを抽出する必要があります。
私は、ヘッダーをある程度デコードできるところまで持っています。一部の数字は意味をなさないので、多少言いますが、ほとんどの数字は意味があります。これに数日を費やした後 (私は 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とプログラミングを学んでいるので、経験豊富なコーダーにあなたが与える答えは私の頭を悩ませるかもしれないことに注意してください。)