[] 目次

Simple DirectMedia Layer API を使う

エンディアン非依存

  • 現在のシステムのエンディアンの調査

C プリプロセッサの define シンボル SDL_BYTEORDER が 現在のシステムのバイト並びによって SDL_LIL_ENDIAN か SDL_BIG_ENDIAN のいずれかに定義されています。

リトルエンディアンのシステムがディスクにデータを書くと、こう並びます。
     [lo-bytes] [hi-bytes]
ビッグエンディアンのシステムがディスクにデータを書くと、こう並びます。
     [hi-bytes] [lo-bytes]

Tip:
x86 システムはリトルエンディアンで、PPC はビッグエンディアンです。
Example:
#include "SDL_endian.h"

#if SDL_BYTEORDER == SDL_LIL_ENDIAN
#define SWAP16(X)    (X)
#define SWAP32(X)    (X)
#else
#define SWAP16(X)    SDL_Swap16(X)
#define SWAP32(X)    SDL_Swap32(X)
#endif
  • 異なるエンディアンのシステム間でのデータ交換

SDL では SDL_endian.h にデータのエンディアンを交換する 高速なマクロSDL_Swap16() と SDL_Swap32() があります。 特定のエンディアンのデータをローカルシステムのエンディアンに交換する マクロも定義されています。

Tip:
システムのバイト並びを知る必要があるものの、交換関数は全て要らない場合は、 SDL_endian.h の代わりに SDL_byteorder.h をインクルードします。
Example:
#include "SDL_endian.h"

void ReadScanline16(FILE *file, Uint16 *scanline, int length)
{
    fread(scanline, length, sizeof(Uint16), file);
    if ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) {
        int i;
        for ( i=length-1; i >= 0; --i )
            scanline[i] = SDL_SwapLE16(scanline[i]);
    }
}

[] 目次