[英]C# vs C: Organizing Data Structures
我想定义一个可以按字节访问的数据结构。 换句话说:我想以字节为单位传输特定数据结构的对象。
目标是对数据进行高级访问(按名称访问)以及仅按字节进行的低级访问。
我确实有一个数据传输协议,它具有特定的数据包格式(标头、有效负载、CRC、...甚至位定义。最终整个数据包是 32 位对齐的)。
在“C”中,我定义了一个结构并通过将该对象转换为字节数组来逐字节访问该结构的对象。 IE:
/* C-Code */
typedef struct
{
int16_t a;
int8_t b;
/* And a bit-wise definition to make thinks really cool */
int8_t bit_0 : 1;
int8_t bit_1_7 : 7;
/* (Total size is 4 bytes i.e. 32-bit aligned) */
} MY_STRUCT_t;
“my_struct”现在应该按字节读取,例如将其传输到某个位置:
不表达方式:
/* C-Code */
void main(void)
{
MY_STRUCT_t my_struct;
for(uint32_t i = 0; i < sizeof(my_struct); i++)
{
Transfer_Byte( *((uint8_t *) &my_struct) + i);
}
}
或者为了使其更具表现力,我还将定义以下“联合”:
/* C-Code */
typedef union
{
MY_STRUCT_t data;
uint8_t bytes[sizeof(MY_STRUCT_t)];
} MY_STRUCT_u;
并这样做:
/* C-Code */
void main(void)
{
MY_STRUCT_u my_struct; // object of the union this time!
for(uint32_t i = 0; i < sizeof(my_struct); i++)
{
Transfer_Byte(my_struct.bytes[i]);
}
}
题
干杯
对于 C#,您最好实现“ToByte”和“FromByte”函数并直接处理字段以确保以您希望的方式对数据进行排序。
顺便说一句。 我谨慎使用 struct union 技巧,除非您在同一平台上打包和解包并且可执行,因为字节顺序是平台和编译器相关的多字节值。
对于低级访问,有一个StructLayoutAttribute.Pack 字段与FieldOffsetAttribute结合使用
使用这些属性,您可以管理字节在结构中的对齐方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.