我必须将一个DWORD(无符号长)RGBA转换为四个int变量(R,G,B和A)到目前为止,我有这个函数将4个int转换为DWORD:
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA << 24) | (iR << 16) | (iG << 8) | iB);
}
Run Code Online (Sandbox Code Playgroud)
我该如何将其转换回来?
就像是
struct RGBA
{
int R, G, B, A;
};
RGBA DWORD2RGBA(unsigned long dwColor)
{
static RGBA tmp;
//.......conversion process
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
任何形式的帮助将不胜感激!:)
谢谢
AnT*_*AnT 10
如果我是你,我会在打包/解包功能中坚持使用乘法 - 加法运算.像这样的东西
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA * 256 + iR) * 256 + iG) * 256 + iB;
}
Run Code Online (Sandbox Code Playgroud)
具有对称拆包功能
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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,整个代码中只有一个"魔术常量".
当然,如果您有一个根据打包数据中的位模式编写的外部规范,那么基于位和移位操作的版本可能是首选的.仍然
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;
}
Run Code Online (Sandbox Code Playgroud)
具有更少的"魔力常数".
现在,您可以将重复动作/子表达式包装在宏或更好的内联函数中,并获得非常紧凑和可读的打包器/解包器.