Endianness также может влиять на биты, а не только на байты, однако единственный раз, когда вы обычно видите эффекты, находится в битовом поле. Это одна из причин, почему порядок битовых полей в структуре и смещения байтов, в которых они живут, определяется реализацией.
Глядя на это определение, представляется, что для данной реализации битовые поля физически размещаются в порядке в системах с прямым порядком байтов и в обратном порядке для каждого байта в системе с прямым порядком байтов.
В частности, первые 4 битовых поля занимают 8 битов, а следующие 2 битовых поля занимают 8 битов. Таким образом, в случае с прямым порядком байтов порядок первых 4 битовых полей меняются друг на друга, а последние 2 битовых поля меняются друг на друга.
Код подобный этому распространен в системных заголовочных файлах. Например, /usr/include/netinet/in.h в Linux содержит следующую структуру для моделирования заголовка IP:
struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
u_int8_t tos;
u_int16_t tot_len;
u_int16_t id;
u_int16_t frag_off;
u_int8_t ttl;
u_int8_t protocol;
u_int16_t check;
u_int32_t saddr;
u_int32_t daddr;
/*The options start here. */
};
Предположительно, идея состоит в том, что буфер, содержащий необработанный сетевой пакет, может использовать memcpy
для копирования байтов в экземпляр этой структуры (или просто иметь указатель на эту структуру, указывающий на буфер, если он выровнен правильно) упростить сериализацию / десериализацию. Вам все равно нужно будет вызвать семейство функций htonx
/ ntohx
, чтобы правильно прочитать целочисленные поля, занимающие более одного байта.