如何将十六进制值放入24位结构中

时间:2014-08-21 06:23:42

标签: c struct hex

所以我有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 1100uint8_t a的结构中它会起作用,因为它会“适合“16位。但我得到uint8_t buint8_t auint8_t b这么24位,这就是我的问题..

我试过了:

uint8_t c

但这不起作用。但这确实有效,如果我从结构中删除someName_t msg; sscanf(res[0], "0x%x", &(msg.cmdID)); 变量,因为它然后适合其余的16位..

那么如何在不调整结构的情况下将值uint8_t c放入此(24位)结构中。

2 个答案:

答案 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上运行正常。