Назад к вопросам
Junior
123
questionbank

Что вы знаете о нотациях Big Endian, Little Endian и Middle Endian?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Big Endian: старший (самый значимый) байт многобайтового числа помещается в младший адрес памяти, а младший байт — в старший. Little Endian: младший (самый значимый) байт многобайтового числа помещается в младший адрес памяти, а старший байт — в старший. Middle Endian: не является общепринятой нотацией. Иногда под ней понимают случаи, когда порядок байт отличается от BigEndian и LittleEndian, например, при обработке многобайтовых чисел блоками по 2 байта.

Пример для 4-байтового числа 0x12345678:

Адрес Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

Большинство современных процессоров (Intel, AMD) используют Little Endian. Сетевые протоколы, как правило, используют Big Endian (так называемый "сетевой порядок байт").

Проверить endianness системы можно так:

#include <iostream>

int main() {
    int x = 1;
    // Создаем указатель на байт и смотрим на первый байт числа 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Для преобразования между порядками байт в C++ используются функции из заголовков <arpa/inet.h> (для сетевого порядка) или <endian.h> (более общие).

#include <arpa/inet.h> // For htons, htonl, ntohs, ntohl

int main() {
    uint16_t host_short = 0x1234;
    uint32_t host_long = 0x12345678;

    // Преобразование из хост-порядка в сетевой (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Преобразование из сетевого (Big Endian) в хост-порядок
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}