挚感数据包细化说明
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 字节

浙公网安备 33010602011771号