[英]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.