如何从C中的十六进制中提取RGB?

如何从C中的十六进制中提取RGB?,c,C,我有一个十六进制颜色,比如0xaabbcc作为uint32_t,我想提取单个RGB组件,所以我想要0xaa、0xbb和0xcc。我就是这样做的: uint32_t color_hex = ((uint32_t)0xaabbcc); uint8_t red = (uint8_t)((color_hex >> 16) & 0xFF); uint8_t green = (uint8_t)((color_hex >> 8) & 0xFF);

我有一个十六进制颜色,比如0xaabbcc作为uint32_t,我想提取单个RGB组件,所以我想要0xaa、0xbb和0xcc。我就是这样做的:

    uint32_t color_hex = ((uint32_t)0xaabbcc);
    uint8_t red = (uint8_t)((color_hex >> 16) & 0xFF);
    uint8_t green = (uint8_t)((color_hex >> 8) & 0xFF);
    uint8_t blue = (uint8_t)(color_hex & 0xFF);
    
    // Then I'm doing an i2c write with red, green and blue where the function accepts a uint8_t
    i2c_write(<addr>, <reg>, &red);
    i2c_write(<addr>, <reg>, &green);
    i2c_write(<addr>, <reg>, &blue);

uint32\u t color\u hex=((uint32\u t)0xaabbcc);
uint8_t红色=(uint8_t)((颜色十六进制>>16)和0xFF);
uint8_t绿色=(uint8_t)((颜色>8)和0xFF);
uint8_t蓝色=(uint8_t)(颜色为十六进制和0xFF);
//然后我用红色、绿色和蓝色写i2c,函数接受uint8\t
i2c_写入(,&红色);
i2c_写入(,&绿色);
i2c_写入(,&蓝色);

红色、绿色和蓝色的值分别不是0xaa、0xbb和0xcc。我得到了0xcd、0xce和0xcf。有人能帮我吗?

问题在于您使用
i2c\u write
功能的方式

您说它接受at
uint8\u t
,但传递一个
uint8\u t*
作为参数

而不是

i2c_write(<addr>, <reg>, &red);
i2c_写入(,&red);
你应该这样做

i2c_write(<addr>, <reg>, red);
i2c_写入(,红色);
您得到的三个值是任意的,但都是顺序号,因为
红色
绿色
蓝色
都可能存储为单个相邻字节

假设函数是用参数正确声明的,指针将被截断到最低字节



假设函数是用参数声明的,我希望编译器会对此发出警告/错误,将整数作为指针函数参数传递。如果没有,您应该增加编译器发出的警告级别。始终注意编译器警告。

您好,谢谢您的回答。我把它改为使用
i2c\u写入(,红色)但值仍然错误:(@innyme您现在得到的值是什么?这是一个足够的更改,结果应该完全不同。对不起,我忘记将颜色更改回我实际使用的颜色,而不是看起来像白色的aabbcc。这解决了问题-非常感谢!您有太多不必要的强制转换和parentheses@phuclv这不应该影响你y我的值是错误的,虽然我当然知道。这就是为什么它只是一个注释,说明它会大大降低更复杂代码的可读性。无论如何,你应该添加关于你正在使用的平台的信息,因为我发现的
i2c\u write
函数没有收到3个这样的参数