Mit tud a Big Endian, Little Endian és Middle Endian jelölésekről?
sobes.tech MI
Válasz az MI-től
Big Endian: a több bájtos szám legjelentősebb (legértékesebb) bájtja a legkisebb címen helyezkedik el, míg a legkevésbé jelentős bájt a legnagyobb címen. Little Endian: a több bájtos szám legkevésbé jelentős bájtja a legkisebb címen helyezkedik el, míg a legjelentősebb bájt a legnagyobb címen. Middle Endian: nem széles körben elfogadott jelölés. Néha olyan esetekre utal, amikor a bájtok sorrendje eltér a Big Endian és Little Endian között, például több bájtos számok feldolgozásakor 2 bájtos blokkokban.
Példa egy 4 bájtos számra, 0x12345678:
| Cím | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
A legtöbb modern processzor (Intel, AMD) Little Endian-t használ. A hálózati protokollok általában Big Endian-t ("hálózati sorrend") használnak.
A rendszer endianness-ét így lehet ellenőrizni:
#include <iostream>
int main() {
int x = 1;
// Létrehozunk egy byte pointert, és ellenőrizzük az első byte-ot
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
A byte sorrendek közötti átalakáshoz C++-ban a <arpa/inet.h> (hálózati sorrendhez) vagy <endian.h> (általánosabb) fejlécekben található függvényeket használják.
#include <arpa/inet.h> // htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Átalakítás a host sorrendből a hálózati sorrendbe (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Átalakítás a hálózati sorrendből a host sorrendbe
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}