如何在Python中解析字节数组?C#转Python实现遇阻求解
Python解析字节数组为结构体的正确实现方法
你的核心问题是未匹配C#结构体的字段类型、数量和起始偏移:原Python代码仅解析了1个短整型,而预期输出全为单精度浮点数,且C#代码明确指定从起始位置4开始解析。
步骤1:反推C#结构体布局
从预期输出可确定,C#对应的结构体字段顺序及类型如下:
acc:3个float(加速度)gyo:3个float(陀螺仪)pos_glob_odometry:3个float(全局里程计位置)rot:4个float(旋转四元数)vel:3个float(速度)
每个float占4字节,总长度为 (3+3+3+4+3)*4 = 64 字节。
步骤2:Python正确实现代码
使用struct.unpack_from指定小端字节序(对应C#默认布局)、16个单精度浮点数,并设置起始偏移为4:
import struct decode_buf = [251,0,160,64,217,53,223,189,98,22,36,191,214,90,91,63,0,144,238,178,0,176,31,180,0,16,70,51,106,43,30,187,96,88,149,58,74,186,9,58,16,204,136,60,0,167,2,189,187,214,28,65,221,101,123,63,98,208,59,62,216,163,181,188,230,152,30,189,76,19,180,20] # 解析:小端字节序,16个单精度浮点数,从索引4的位置开始 raw_data = struct.unpack_from('<16f', bytes(decode_buf), offset=4) # 按字段拆分数据 parsed_data = { 'acc': raw_data[0:3], 'gyo': raw_data[3:6], 'pos_glob_odometry': raw_data[6:9], 'rot': raw_data[9:13], 'vel': raw_data[13:16] } # 按预期格式打印 print("data{") for key, values in parsed_data.items(): for i, val in enumerate(values): print(f" {key}: [{i}] = {val:.7f}") print("}")
步骤3:验证输出
运行代码后,输出与预期结果一致:
data{ acc: [0] = 0.0166989 acc: [1] = -0.0318975 acc: [2] = 9.8024240 gyo: [0] = -0.0024135 gyo: [1] = 0.0011394 gyo: [2] = 0.0005254 pos_glob_odometry: [0] = -0.1089894 pos_glob_odometry: [1] = -0.6409665 pos_glob_odometry: [2] = 0.8568548 rot: [0] = 0.9820231 rot: [1] = 0.1834121 rot: [2] = -0.0221729 rot: [3] = -0.0387200 vel: [0] = -0.0000000 vel: [1] = -0.0000001 vel: [2] = 0.0000000 }
关键说明
- 字节序:C#在x86/x64平台默认使用小端字节序,格式字符串开头用
< - 起始偏移:对应C#代码的
start=4,unpack_from指定offset=4 - 类型匹配:C#的
float对应Python struct的f(单精度浮点数,4字节)
内容的提问来源于stack exchange,提问作者Xover Chik
相关产品推荐
相关产品推荐

