[Předchozí] Obsah

Použití Simple DirectMedia Layer API

Nezávislost na pořadí bytů platformy

  • Detekce pořadí bytů použitého systému

Makro SDL_BYTEORDER preprocesoru jazyka C je v závislosti na použitém systému definováno buď jako SDL_LIL_ENDIAN, nebo jako SDL_BIG_ENDIAN.

Systém označovaný jako "little endian", který zapisuje data na disk, je rozloží takto:
     [nižší byty] [vyšší byty]
Systém označovaný jako "big endian", který zapisuje data na disk, je rozloží takto:
     [vyšší byty] [nižší byty]

Tip:
Systémy x86 jsou little endian, PPC systémy jsou big endian.
Příklad:
#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
  • Transformace dat v systémech s odlišným pořadím bytů

SDL poskytuje v SDL_endian.h dvojici rychlých maker, SDL_Swap16() a SDL_Swap32(), která vám otočí pořadí bytů. Také jsou definovaná makra, která převede data v konkrétním uspořádání do uspořádání lokálního systému.

Tip:
Pokud jen potřebujete znát způsob řazení bytů systému a nepotřebujete prohazovací funkce, do svého zdrojového kódu zahrňte SDL_byteorder.h namísto SDL_endian.h.
Příklad:
#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]);
    }
}

[Předchozí] Obsah