[Назад] Содержание

Использование Simple DirectMedia Layer API

Независимость от порядка байтов

  • Определение порядка байтов в текущей системе

Препроцессор C заменяет SDL_BYTEORDER на SDL_LIL_ENDIAN (младше-конечные) или SDL_BIG_ENDIAN (старше-конечные), в зависимости от порядка байтов в текущей системе.

Младше-конечные системы это те, которые пишут данные на диск размещая так:

     [младшие байты] [старшие байты]
Старше-конечные системы пишут данные на диск так:

     [старшие байты] [младшие байты]

Совет:
В системах x86 младший байт-первый (little-endian), PPC наоборот (big-endian).

 

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(), которые производят обмен данными с указаным вами порядком байтов. Также определены макросы для обмена данными со специфичным для данной системы порядком байтов.

Совет:
Если вам нужно знать порядок байтов в текущей системе, но не нужны все перестановочные функции, подключите SDL_byteorder.h вместо SDL_endian.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]);
    }
}

[Назад] Содержание