0

エンディアンについて質問があります。色を HTML 形式 (#aabbcc のような RGB) で保存するのが好きです。

コードでは常に 0xaabbcc を使用して色を保存し、赤、緑、青の色を抽出するために、次のようにマスクを適用します。

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

これはうまく機能しますが、ビッグ エンディアンのマシンでテストしていません。結果は同じでしょうか?

man SDL_CreateRGBSurface の例のように、SDL がサーフェスを作成するためにエンディアンをチェックすることを確認する必要があります。

#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);
4

3 に答える 3

2

はい。ビットマスクはエンディアンに依存しません。エンディアンが問題になる唯一の場所は、それをバイト配列 (または c では a char *) にキャストする場合です。この場合、エンディアンが問題になります。

また、sizeof(int) > 3このコードを使用する前に確認してください!

于 2012-06-05T18:04:46.727 に答える
0

実際の個々のビットを扱っている限り、エンディアンは問題ではありません。ビットが表す数値を処理するときに問題が発生します。単に値を設定し、マスクを使用してそれを読み戻すだけなので、問題はないはずです。

于 2012-06-05T18:05:26.600 に答える
0

なんらかの方法でデータをシリアル化する (ディスクに保存する、ネットワーク リンクを介して送信する) か、整数以外のものとしてデータにアクセスする (a に言及している Richard J. Ross III の回答のようにchar *) 場合を除き、それは問題ではありません。変数とマスクのバイト順は同じです。

于 2012-07-09T20:27:48.547 に答える