挚感数据包细化说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public struct MeasureResultV_t { public UInt32 check_id; //数据包校验ID,固定0Xaabbccdd,其他值请丢弃该数据包 public UInt64 tick; // 数据包ID,自增 public float sys_temp; //模块温度 //MarshalAs属性指示如何在托管代码和非托管代码之间封送数据 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public float [] distance; public int distance_len; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public float [] amp; public int amp_len; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public double [] rem_angle; public int rem_angle_len; MeasureResultV_t(UInt32 a) //靠 ,结构体也有了构造函数的概念了 { check_id = a; //数据包校验ID,固定0Xaabbccdd,其他值请丢弃该数据包 tick = 0; //数据包ID,自增 amp_len = 0; //回光强度长度 sys_temp = 0; //模块温度 distance_len = 0; //距离长度 rem_angle_len = 0; //回光强度长度 rem_angle = new double [256]; //测量结果信息,V9版本主输出,振动信号由该数据检测 distance = new float [256]; //距离数组 amp = new float [256]; //设备接收光功率,回光强度数组 } } |
***
数据包大小:该结构体实例在 64 位系统中占用 4136 字节。
字段内存占用与对齐规则
-
UInt32
:4 字节UInt64
:8 字节float
:4 字节int
:4 字节double
:8 字节
-
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
表示内联定长数组,占用连续内存:float
:256 × 4 = 1024 字节double
:256 × 8 = 2048 字节
-
- 结构体总大小需是 最大成员类型大小的整数倍(此处最大为
double
的 8 字节)。 - 成员起始偏移需是 自身大小的整数倍(如
UInt64
需 8 字节对齐)。
- 结构体总大小需是 最大成员类型大小的整数倍(此处最大为
******************
总内存占用
-
字段总和:
4 (check_id) + 8 (tick) + 4 (sys_temp) + 1024 (distance) + 4 (distance_len) + 1024 (amp) + 4 (amp_len) + 2048 (rem_angle) + 4 (rem_angle_len) = 4120 字节
-
对齐填充:
check_id → tick
填充 4 字节amp_len → rem_angle
填充 4 字节- 末尾填充 4 字节(总大小需 8 对齐)
总计填充:4 + 4 + 4 = 12 字节
-
最终大小:
4120 + 12 = 4136 字节
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了