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;
    // Байтка көрсөтүүчү түзүп, биринчи байтты текшеребиз
    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);

    // Тармак тартибинен хост тартибине которуу
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}