[이전] 목차

Simple DirectMedia Layer API 사용하기

엔디안 비의존성(Endian independence)

  • 현재 시스템의 엔디안(endianness)을 결정하기

C 전처리기(preprocessor)는 SDL_BYTEORDER 를 현재 시스템의 바이트 순서(byte order)에 따라 SDL_LIL_ENDIAN 또는 SDL_BIG_ENDIAN 로 정의한다.

리틀 엔디안(little endian) 시스템은 아래와 같은 순서로 데이타를 디스크에 쓴다 :
     [lo-bytes] [hi-bytes]
빅 엔디안(big endian) 시스템은 아래와 같은 순서로 데이타를 디스크에 쓴다 :
     [hi-bytes] [lo-bytes]

팁:
x86시스템들은 리틀 엔디안이며, PPC 시스템들은 빅 엔디안이다.
예제:
#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() 함수는 데이타의 엔디안을 스왑(swap)시킨다. 또한 특정 엔디안의 데이타를 로컬 시스템의 엔디안으로 변환시키는 매크로도 제공한다.

팁:
만약 시스템의 바이트-순서(byte-order)만 알고 싶고, 모든 스왑 함수들은 필요없다면, SDL_endian.h 대신에 SDL_byteorder.h 를 인클루드하라.
예제:
#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]);
    }
}

[이전] 목차