понедельник, 8 сентября 2014 г.

Кроссплатформенность и порядок байтов

Стандарт С99 вводит заголовочный файл stdint.h, в котором определяются архитектурно-независимые целочисленные типы данных:

int8_t,  int16_t,  int32_t,  int64_t     знаковые
uint8_t, uint16_t, uint32_t, uint64_t    беззнаковые

LE - x86, x64, i8051, Atmel AVR
BE - ARM, PowerPC, SPARC, Atmel AVR32

Для работы с различным порядком байтов используется семейство функций htonX() и ntohX(). Заголовочные файлы для этих функций различны для разных ОС, поэтому лучше использовать макрос:

#ifdef _MSC_VER
#include <winsock2.h>
#else
#include <arpa/inet.h>
#endif

htonX() преобразует порядок байтов из принятого для данной архитектуры в сетевой (big-endian).
ntohX() преобразует порядок байтов из сетевого (big-endian) в принятый для данной архитектуры.

htons(), ntohs() - short
htonl(), ntohl() - long
htonll(), ntohll() - long long

Макрос для определения стандартной функции hton() (для стандарта С11).

#define hton(x) _Generic(x, 
short: htons(x),
long:  htonl(x),
long long: htonll(x))

Комментариев нет :

Отправить комментарий