我知道这已经很老了,但我还想提供一个没有任何位运算的联合解决方案。
union Color
{
unsigned int hex;
struct { unsigned char b, g, r; };
};
通过这种方式,您可以轻松地从 HEX 转换为 RGB,从 RGB 转换为 HEX。
union Color hex;
hex.hex = 0x07C73C;
union Color rgb;
rgb.r = 7;
rgb.g = 199;
rgb.b = 60;
printf("RGB(%d, %d, %d), HEX(%06x)", hex.r, hex.g, hex.b, rgb.hex);
输出:
RGB(7, 199, 60), HEX(07c73c)
要映射 0.0 到 1.0 范围内的值,只需将其除以 255.0 :)
编辑:
以上代码^^仅在Little-Endian CPU架构下支持,更好的方式是check what endianness does the system runs on。
然后你可以检查字节序来定义结构变量的顺序。
union Color
{
unsigned int hex;
#if IS_BIG_ENDIAN
struct { unsigned char a, r, g, b; };
#else
struct { unsigned char b, g, r, a; };
#endif
};
此代码还支持 RGBA 中的 alpha(透明度)。