Sobes.tech
Junior

Какво знаете за нотациите Big Endian, Little Endian и Middle Endian?

sobes.tech AI

Отговор от AI

Big Endian: най-значимият (най-важният) байт на многобайтово число се поставя в най-малкия адрес на паметта, а най-малко значимият — в най-големия. Little Endian: най-малко значимият байт на многобайтово число се поставя в най-малкия адрес на паметта, а най-значимият — в най-големия. Middle Endian: не е широко приета нотация. Понякога се разбира като случаи, когато редът на байтовете се различава от Big Endian и Little Endian, например при обработка на многобайтови числа в блокове по 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> // За 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;
}