Using SDL: 엔디안 비의존성

[이전] 목차 # 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]);
        }
    }
[이전] 목차