将结构添加到C中的char数组中

Sim*_*nns 2 c arrays struct

我有一个C程序接收一个64字节的char数组(通过USB传递).根据第一个字节(表示命令类型),我想在char数组上"强加"一个结构,以使代码更清晰.

例如,如果命令代码是10,我会期望类似:

struct
{
    uint8_t commandNumber;
    uint16_t xPos;
    uint16_t yPos;
    int32_t identificationNumber;
 } commandTen;
Run Code Online (Sandbox Code Playgroud)

所以我想将我的char数据包[64]'投射到'commandTen上,然后使用类似的东西访问字段:

localVar = commandTenPacket->xPos;
Run Code Online (Sandbox Code Playgroud)

如何在C中实现这一目标?

提前致谢!

Jen*_*edt 8

首先,正如其他人所说,你必须确保你struct没有填充.您的编译器可能有一个扩展名,#pragma pack或者左右.

struct为每个用例定义一个,而不是像示例中的变量.

然后定义一个 union

typedef union overlay overlay;

union overlay {
 uint8_t raw[64];
 struct type10 command10;
 struct type42 command42;
};
Run Code Online (Sandbox Code Playgroud)

现在创建该类型的缓冲区

overlay buffer;
Run Code Online (Sandbox Code Playgroud)

将"原始"部分提供给接收数据的函数:getit(buffer.raw).然后

switch (buffer.raw[0]) {
 case 10: {
   // use buffer.command10
   break;
 }
 case 42: {
   // use buffer.command42
 }
}
Run Code Online (Sandbox Code Playgroud)

由于您正在阅读uint8_tAKA的所有内容,因此C标准可以很好地保证这一点unsigned char.事实上,unions 的主要用例就是这种"类型惩罚".具有不同类型的IPv4,IPv6等地址的整个网络层以类似的方式工作.