Python修改文件特定字节值:GPS与传感器数据时间同步问题
解决传感器数据与GPS时间戳递增匹配的问题
你完全可以直接操作二进制时间戳的数值来实现5ms递增,不需要转换成文本——这不仅更高效,也能避免文本转换带来的格式错误。下面是具体的思路和修改后的代码:
核心思路
GPS文件中的8字节时间戳本质是二进制存储的数值(大概率是64位整数,比如毫秒级Unix时间戳,或者双精度浮点型的秒级时间戳)。我们只需要:
- 把读取到的二进制字节解析成可计算的数值
- 针对每组传感器数据,计算出递增5ms后的时间戳数值
- 把计算后的数值转回二进制字节,再写入输出文件
修改后的代码示例
这里假设GPS时间戳是64位小端字节序的毫秒级整数(如果是大端或者浮点型,只需要调整struct.unpack的格式符即可):
import struct piece_size_acc = 24 piece_size_gps = 8 # 根据实际格式调整格式符:<q是小端64位整数,>q是大端,d是双精度浮点 TIMESTAMP_FORMAT = "<q" with open(r"C:\PATH\00000003.acc.bin", "rb") as in_file_acc, \ open(r"C:\PATH\00000003.gps.bin", "rb") as in_file_gps, \ open(r"C:\PATH\merged_output.bin", "wb") as output_file: tempNumOfBytesRead = 0 while True: # 定位到当前GPS时间戳的位置(60字节偏移) in_file_gps.seek(tempNumOfBytesRead + 60) piece_gps = in_file_gps.read(piece_size_gps) tempNumOfBytesRead += 60 + 8 # 更新已读取的GPS字节数 if not piece_gps: break # GPS文件读取完毕 # 解析二进制时间戳为数值 base_timestamp = struct.unpack(TIMESTAMP_FORMAT, piece_gps)[0] for i in range(200): piece_acc = in_file_acc.read(piece_size_acc) if not piece_acc: break # 传感器文件提前读完 # 计算当前组的时间戳:初始值 + i*5ms current_timestamp = base_timestamp + i * 5 # 把数值转回二进制字节 current_timestamp_bytes = struct.pack(TIMESTAMP_FORMAT, current_timestamp) # 写入传感器数据和递增后的时间戳 output_file.write(piece_acc) output_file.write(current_timestamp_bytes)
关键细节说明
- 格式符调整:如果你的GPS时间戳是其他格式,比如大端整数用
>q,双精度浮点(秒级,5ms就是加0.005)用d,只需要修改TIMESTAMP_FORMAT即可。你可以通过查看已知的时间戳值来验证格式是否正确。 - 避免重复关闭文件:原代码里多次调用
output_file.close()是多余的,使用with语句会自动在代码块结束时关闭文件,更安全。 - 效率优势:直接操作二进制数值比转文本的方式快得多,尤其是处理大文件时,能明显减少IO和计算开销。
内容的提问来源于stack exchange,提问作者Noob14
相关产品推荐
相关产品推荐

