整数以C语言存储颜色,依赖于endian

时间:2012-06-05 18:01:19

标签: c colors endianness

我有关于字节序的问题,我喜欢将我的颜色存储为HTML格式(RGB像#aabbcc)。

我总是在我的代码中使用0xaabbcc存储颜色,然后提取红色,绿色和蓝色,我应用这样的掩码:

int color = 0xaabbcc;
int r = color & 0xff0000;
int g = color & 0x00ff00;
int b = color & 0x0000ff;

这种方法效果很好,但我没有在大端机器下测试过,结果会不一样?

我必须看到SDL检查endian以创建表面,如man SDL_CreateRGBSurface的例子所示:

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
   rmask = 0xff000000;
   gmask = 0x00ff0000;
   bmask = 0x0000ff00;
   amask = 0x000000ff;
#else
   rmask = 0x000000ff;
   gmask = 0x0000ff00;
   bmask = 0x00ff0000;
   amask = 0xff000000;
#endif

   surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32,
                                  rmask, gmask, bmask, amask);

3 个答案:

答案 0 :(得分:2)

是。 Bitmasks独立于字节序。如果你将字节序转换为字节数组(或者,在c中为char *),那么字节序将成为问题的唯一地方就是,在这种情况下,字节顺序很重要。

在使用此代码之前,请确保sizeof(int) > 3

答案 1 :(得分:0)

只要您处理实际的个别位,字节顺序无关紧要。在处理位表示的数值时遇到问题。您只需设置一个值,然后使用掩码将其读回,这样您就不会有任何问题。

答案 2 :(得分:0)

除非您以某种方式序列化数据(保存到磁盘,通过网络链接发送)或将其作为整数以外的方式访问(如Richard J. Ross III的答案中提到char *) ,没关系。您的变量和掩码具有相同的字节顺序。