[Precedente] Contenuti

Usare la Simple DirectMedia Layer API

Endian independence

  • Determinare il modo endian usato dal sistema

Il preprocessore C definisce il simbolo SDL_BYTEORDER, che puo' essere SDL_LIL_ENDIAN o SDL_BIG_ENDIAN, in base all'ordine dei byte usati dal sistema in uso.

Un sistema little endian scrive cosi' i dati sul disco:
     [lo-bytes] [hi-bytes]
Un sistema big endian, invece, scrive cosi' i dati:
     [hi-bytes] [lo-bytes]

Suggerimento:
I sistemi x86 sono little endian, i PPC sono big endian.
Esempio:
#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
  • Convertire i dati tra i diversi modi endian

SDL fornisce due veloci macro in SDL_endian.h, SDL_Swap16() e SDL_Swap32(), che scambiano i dati tra i diversi sistemi. Ci sono anche macro che convertono dati espressi in uno specifico modo al modo utilizzato dal sistema corrente.

Suggerimento:
Se si ha necessita' di sapere l'ordine dei byte usato dal sistema, ma non si prevede di utilizzare le funzioni di conversione, e' opportuno includere byteorder.h anziche' SDL_endian.h
Esempio:
#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]);
    }
}

[Precedente] Contenuti