C#: 结构体 struct 应用笔记

说明:记录 在 C# 中的一些结构体相关的应用

1. 结构体中定义固定长度的数组

在下面的示例中,在struct中定义了一个固定长度为 8 的 byte 数组data。通过使用MarshalAsAttributeUnmanagedType.ByValArray参数,指定了数组的类型为值类型数组,并使用SizeConst字段指定了数组的大小为 8。请注意,使用固定长度的数组时,需要确保数组的大小与指定的大小一致,否则可能会导致数据访问错误。

cs 复制代码
public struct OTA_TX_CMD_FRAME
{
    public byte head;             //数据头
    public byte chs;              //通道
    public byte group;            //group
    public byte cmd;              //命令,功能码
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] data;           //发送数据
    public UInt16 crc16;          //校验值
}

结构体中的数组使用

cs 复制代码
OTA_TX_CMD_FRAME ota_cmd_start = new OTA_TX_CMD_FRAME();
ota_cmd_start.data = new byte[8]; 
ota_cmd_start.head = OTA_CMD_DATA_HEAD;
ota_cmd_start.chs = chs;
ota_cmd_start.group = (byte)(ota_mode << 4);
ota_cmd_start.data[6] = Convert.ToByte(comboBox_bin_ver_1.Text);
ota_cmd_start.data[5] = Convert.ToByte(comboBox_bin_ver_2.Text);
ota_cmd_start.data[4] = Convert.ToByte(comboBox_bin_ver_3.Text);

ota_cmd_start.data[3] = (byte)(((UInt32)(MyGlobal.File_size)) >> 24);
ota_cmd_start.data[2] = (byte)(((UInt32)(MyGlobal.File_size)) >> 16);
ota_cmd_start.data[1] = (byte)(((UInt32)(MyGlobal.File_size)) >> 8);
ota_cmd_start.data[0] = (byte)(((UInt32)(MyGlobal.File_size)) >> 0);
复制代码

2. C# 结构体struct 转 byte 数组

C#中可以使用Marshal类的StructureToPtr方法将结构体转换为字节数组。下面是一个示例代码:

cs 复制代码
public struct Data1
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public char[] Device_ID;
}

public byte[] StructToBytes<T>(T obj)
{
    int size = Marshal.SizeOf(typeof(T));
    IntPtr bufferPtr = Marshal.AllocHGlobal(size);
    try
    {
        Marshal.StructureToPtr(obj, bufferPtr, false);
        byte[] bytes = new byte[size];
        Marshal.Copy(bufferPtr, bytes, 0, size);
        return bytes;
    }
    catch (Exception ex)
    {
        throw new Exception("Error in StructToBytes! " + ex.Message);
    }
    finally
    {
        Marshal.FreeHGlobal(bufferPtr);
    }
}

// 使用示例
Data1 data = new Data1();
data.Device_ID = new char[] { 'A', 'B' };

byte[] byteArray = StructToBytes(data);
相关推荐
风云1 小时前
MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架
开源·c#·.net·日志·高性能·minilog
慧都小妮子2 小时前
C# 工程图纸数字化入库实战:Aspose.Imaging 自动抠图、多页 TIFF 合卷与坏页容错
图像处理·c#·.net·aspose·tiff·归档·文档管理
samble6 小时前
从零搭建工业控制系统(二十一):状态管理系统——中心状态对象设计
c#·wpf·mvvm·状态管理·工业控制
俊昭喜喜里8 小时前
C#中的func<>
java·前端·c#
highreport8 小时前
net报表工具对比:HighReport 与 FastReport
java·c#
reasonsummer8 小时前
【办公类-146-05】20260901《一分园、二分园四大教育》(优化版:标题excle+复制AI文字+Python占位符录入)
开发语言·数据库·c#
CSDN_RTKLIB8 小时前
C#可选参数时重载
c#
古少侠9 小时前
用 DS随心转 把 AI 画的 Mermaid 流程图转成 Word 里的高清图
开发语言·c#·word
智者知已应修善业10 小时前
C#用一个循环[等效]取出字符串中的数字
网络·c#·web·string·语言
CSDN_RTKLIB10 小时前
自己的溯源函数注意点
c#