Что вы знаете о нотациях 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;
}