我有一个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中实现这一目标?
提前致谢!
首先,正如其他人所说,你必须确保你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等地址的整个网络层以类似的方式工作.
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |