You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:00:58