Очень абстрактно говоря, endianness - это свойство переинтерпретации переменной как массива char.
Практически, это имеет значение именно тогда, когда вы read()
от и write()
обращаетесь к внешнему потоку байтов (как файл или сокет).Или, если говорить абстрактно, порядковый номер имеет значение, когда вы сериализуете данные (в основном потому, что сериализованные данные не имеют системы типов и просто состоят из немых байтов);и endianness не имеет значение в пределах вашего языка программирования, поскольку язык работает только на значениях , а не на представлениях .Переход от одного к другому, где вы должны копаться в деталях.
То есть:
uint32_t n = get_number();
unsigned char bytesLE[4] = { n, n >> 8, n >> 16, n >> 24 }; // little-endian order
unsigned char bytesBE[4] = { n >> 24, n >> 16, n >> 8, n }; // big-endian order
write(bytes..., 4);
Здесь мы могли бы просто сказать, reinterpret_cast<unsigned char *>(&n)
, и результат зависел бы от порядкового номера системы.
И читаем:
unsigned char buf[4] = read_data();
uint32_t n_LE = buf[0] + buf[1] << 8 + buf[2] << 16 + buf[3] << 24; // little-endian
uint32_t n_BE = buf[3] + buf[2] << 8 + buf[1] << 16 + buf[0] << 24; // big-endian
Опять же, здесь мы могли бы сказать, uint32_t n = *reinterpret_cast<uint32_t*>(buf)
, и результат зависел бы от порядкового номера машины.
Как вы можете видеть, с целочисленными типами вам никогда не нужно знать порядковый номер вашей собственной системы, только потока данных, если вы используете алгебраические операции ввода и вывода.С другими типами данных, такими как double
, проблема более сложная.