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;
}