当前位置: 首页 > news >正文

C#: 结构体 struct 应用笔记

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

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

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

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;          //校验值
}

结构体中的数组使用

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方法将结构体转换为字节数组。下面是一个示例代码:

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);


文章转载自:
http://analgesic.gbfuy28.cn
http://cavernicolous.gbfuy28.cn
http://brittonic.gbfuy28.cn
http://accounts.gbfuy28.cn
http://bitmap.gbfuy28.cn
http://behaviourist.gbfuy28.cn
http://bimorphemic.gbfuy28.cn
http://baroceptor.gbfuy28.cn
http://altazimuth.gbfuy28.cn
http://ainu.gbfuy28.cn
http://bogota.gbfuy28.cn
http://azine.gbfuy28.cn
http://adulterer.gbfuy28.cn
http://ama.gbfuy28.cn
http://actualization.gbfuy28.cn
http://bronchitis.gbfuy28.cn
http://aprosexia.gbfuy28.cn
http://aclu.gbfuy28.cn
http://applesauce.gbfuy28.cn
http://bnd.gbfuy28.cn
http://cctv.gbfuy28.cn
http://carolingian.gbfuy28.cn
http://bother.gbfuy28.cn
http://agromania.gbfuy28.cn
http://charles.gbfuy28.cn
http://anomalism.gbfuy28.cn
http://cathomycin.gbfuy28.cn
http://brickle.gbfuy28.cn
http://cckw.gbfuy28.cn
http://chongqing.gbfuy28.cn
http://www.dtcms.com/a/7441.html

相关文章:

  • sqlserver2012 跨服务器查询
  • 微信公众号注册(详细图文教程)
  • 【Linux】第二十九站:再谈进程地址空间
  • 【架构设计】单体软件向微服务化演变
  • 随机获取某个集合中的某个元素,多次获取时不重复
  • 【论文阅读】Latent Consistency Models (LDMs)、LCM-LoRa
  • 2-认识小程序项目
  • Python网络爬虫进阶:自动切换HTTP代理IP的应用
  • 高纯气体市场调研:预计2029年将达到331亿美元
  • 【K12】Python写串联电阻问题的求解思路解析
  • TinyLog iOS v3.0接入文档
  • 【UE5】交互式展厅数字博物馆交互是开发实战课程
  • Linux下的HTTPS配置:从证书到安全连接
  • 智能小程序小部件(Widget)表单组件属性说明+代码明细
  • springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available
  • 用matlab解决简单的数学问题
  • Unity3D 服务器逻辑和传输如何分层/解耦详解
  • Java热插拔技术之SPI
  • GIT SourceTree 回滚提交
  • 计算机网络-NAT网络地址转换
  • js 正则表达式 校验 input输入框 输入格式必须为日期yyyyMM
  • 微信小程序获取来源场景值
  • RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用
  • 迅为RK3588开发板编译 Buildroot单独编译图形化界面(编译 buildroot)
  • React查询、搜索类功能的实现
  • 【EAI 005】EmbodiedGPT:通过具身思维链进行视觉语言预训练的具身智能大模型
  • 解决虚拟机字体太小的问题
  • 云原生周刊:OpenTofu 宣布正式发布 | 2023.1.15
  • spell_group_stack_rules
  • 移动端开发进阶之蓝牙通讯(二)