【发布时间】:2016-03-25 00:53:05
【问题描述】:
我有一个原始二进制文件 (1 KB↓),它是 GPS 流的串行数据转储(以及一些相关的元数据)。我特别想从代表 GPS 时间的二进制文件中提取一个值;我知道它在文件中的偏移量和宽度(分别为 10 和 8 字节,总帧宽度为 28 字节),但它的编码方式非常奇怪,如下面的引用所述。
读取这些数据(到列表或数组中)的最 Pythonic 方式是什么?
GPS TIME - GPS 传感器时间(以秒为单位的一周时间,从 周六 2400 小时/周日 0000 小时)如果 GPS 时间有效消息 3500 设置为 1,否则报告自上电以来的 SDN500 系统时间。 数据字的顺序为 2、1(MSW)、4(LSW)、3。
SDN500–HV 接口上的消息字长为 16 位。然而, SDN500–HV 协议,它使用标准的通用异步 Receiver Transmitter (UART),以 8 位组(字节)传输数据。 这意味着需要两个字节才能组成一条消息 词。
一个字节的信息作为 11 位的序列传输:一个 起始位,8 位数据(最低有效位(LSB)在前),一个 奇偶校验位(奇数)和一个停止位。对于每个 16 位数据字, 首先发送最低有效字节,然后是最 有效字节。整数和浮点数据类型包括 一个以上的字从最低编号的字传输到 编号最高的单词。该规则的一个例外是时间 标记,在每个 HV 输出消息的字 6-9 中输出。四个 16 位数据字的顺序如下:2,1,4,3,其中 1 代表最重要的词和4个最不重要的词。 每个字都单独进行字节反转。
【问题讨论】:
-
如果您更精通另一种语言(如 Matlab 或 C),我仍然希望看到可以读取此数据的示例 sn-p 代码。这将帮助我了解如何更好地在 Python 中阅读它。
-
希望其他人能给你更好的信息,但是docs.python.org/2/library/struct.html 模块是你开始寻找二进制文件 i/o 的地方。我只用了一小会儿,所以帮不上什么忙了。
-
@JLPeyret 是的,我整天都在搞乱 struct.unpack 变体和十六进制编辑器,试图从中获得合理的值,但还没有找到读取 MSB/LSB 的正确方法结构体。虽然我能够以这种方式阅读其他一些领域。
-
你用的是什么gps设备?
-
@JoranBeasley 这是一个SDN500