所以我有2个结构:
struct cmd {
uint8_t a;
uint8_t b;
uint8_t c;
};
typedef struct someName{
uint8_t size;
struct cmd cmdID;
} someName_t;
我得到一个包含字符串char res[0]
的{{1}}。
这个"0xabc"
需要放在0xabc
结构中。
但问题是cmd
是12位(0xabc
),所以如果我把它放入只有1010 1011 1100
和uint8_t a
的结构中它会起作用,因为它会“适合“16位。但我得到uint8_t b
,uint8_t a
和uint8_t b
这么24位,这就是我的问题..
我试过了:
uint8_t c
但这不起作用。但这确实有效,如果我从结构中删除someName_t msg;
sscanf(res[0], "0x%x", &(msg.cmdID));
变量,因为它然后适合其余的16位..
那么如何在不调整结构的情况下将值uint8_t c
放入此(24位)结构中。
答案 0 :(得分:0)
如果您可以控制输入格式,即可以保证它总是像0xabc
那样,那么您可以尝试:
const char input[] = "0xabc";
uint32_t tmp;
sscanf(input, "0x%x", &tmp);
struct cmd cmdid;
cmdid.a = (tmp & 0xFF0000U) >> 16;
cmdid.b = (tmp & 0xFF00U) >> 8;
cmdid.c = (tmp & 0xFFU);
答案 1 :(得分:0)
您可以尝试将struct cmd
更改为:
struct cmd {
unsigned int c:4;
unsigned int b:4;
unsigned int a:4;
};
但YMMV取决于编译器。在MSVC ++ 2010上运行正常。