我必须将 DWORD(无符号长整型)RGBA 转换为四个 int 变量(R、G、B 和 A)
到目前为止,我有这个函数将 4 个整数转换为 DWORD:
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA << 24) | (iR << 16) | (iG << 8) | iB);
}
我怎样才能把它转换回来?
就像是
struct RGBA
{
int R, G, B, A;
};
RGBA DWORD2RGBA(unsigned long dwColor)
{
static RGBA tmp;
//.......conversion process
return tmp;
}
任何形式的帮助将不胜感激! :)
Thanks
如果我是你,我会坚持在打包/解包函数中使用乘加运算。像这样的东西
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA * 256 + iR) * 256 + iG) * 256 + iB;
}
具有对称拆包功能
RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */
tmp.B = dwColor % 256; dwColor /= 256;
tmp.G = dwColor % 256; dwColor /= 256;
tmp.R = dwColor % 256; dwColor /= 256;
tmp.A = dwColor % 256; /* dwColor /= 256; */
return tmp;
}
请注意,整个代码中只有一个“魔法常量”。
当然,如果您有一个按照打包数据中的位模式编写的外部规范,那么基于位和移位操作的版本可能会更好。仍然
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return (((((iA << 8) + iR) << 8) + iG) << 8) + iB;
}
RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */
tmp.B = dwColor & 0xFF; dwColor >>= 8;
tmp.G = dwColor & 0xFF; dwColor >>= 8;
tmp.R = dwColor & 0xFF; dwColor >>= 8;
tmp.A = dwColor & 0xFF; /* dwColor >>= 8; */
return tmp;
}
具有更少的“魔法常数”。
现在,您可以将重复的操作/子表达式包装在宏中,或者更好的是,内联函数中,并获得非常紧凑且可读的打包器/解包器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)