Какво знаете за нотациите 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;
}