C#:结构体struct应用笔记
- 互联网
- 2025-08-06 03:21:01

说明:记录 在 C# 中的一些结构体相关的应用
1. 结构体中定义固定长度的数组在下面的示例中,在struct中定义了一个固定长度为 8 的 byte 数组data。通过使用MarshalAsAttribute的UnmanagedType.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);C#:结构体struct应用笔记由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C#:结构体struct应用笔记”