Проще всего не писать код, зависящий от порядка байтов. Вы никогда не должны заботиться о том, какова последовательность системы, на которой вы работаете; единственное, что должно иметь значение, - это то, что является обязательным порядком байтов для любых внешних данных, которые вы читаете или пишете. Вам не следует спрашивать о преобразованиях между значениями с прямым и прямым порядком байтов, а о преобразованиях с прямым порядком байтов в порядковый номер хоста, и вы можете написать этот код в независимом от порядков, который (почти) полностью переносим: 1001 *
Например: предположим, что вы читаете 32-разрядное целое число с прямым порядком байтов из потока файлов:
/*
* Note that callers should check feof(fp) afterward to verify that
* there was enough data to read.
*/
uint32_t GetBE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp) << 24;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 8;
result |= fgetc(fp);
return result;
}
uint32_t GetLE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp);
result |= fgetc(fp) << 8;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 24;
return result;
}
(я говорю «(почти) полностью переносимый», потому что он предполагает, что имеется 8 бит на байт. Но если вы работаете в системе, где это не так, у вас, вероятно, будут большие проблемы, когда работа с внешними данными.)