如何从DWORD RGBA转换为int?

dro*_*ath 5 c++

我必须将一个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)

具有更少的"魔力常数".

现在,您可以将重复动作/子表达式包装在宏或更好的内联函数中,并获得非常紧凑和可读的打包器/解包器.