Šta znate o notacijama Big Endian, Little Endian i Middle Endian?
sobes.tech АИ
Одговор од АИ
Big Endian: najznačajniji (najvažniji) bajt višebajtne cifre smešten je na najnižoj adresi memorije, a najmanje značajan bajt na najvišoj. Little Endian: najmanje značajan bajt višebajtne cifre smešten je na najnižoj adresi memorije, a najznačajniji bajt na najvišoj. Middle Endian: nije široko prihvaćen zapis. Ponekad se odnosi na slučajeve kada se redosled bajtova razlikuje od Big Endian i Little Endian, na primer, pri obradi višebajtnih cifara u blokovima od 2 bajta.
Primer za 4-bajtni broj 0x12345678:
| Adresa | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Većina savremenih procesora (Intel, AMD) koristi Little Endian. Mrežni protokoli, u pravilu, koriste Big Endian (tzv. "mrežni red" ili "red bajtova").
Proveru endianness sistema možete uraditi ovako:
#include <iostream>
int main() {
int x = 1;
// Kreirajte pokazivač na bajt i proverite prvi bajt broja 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Za konverziju između redosleda bajtova u C++, koriste se funkcije iz zaglavlja <arpa/inet.h> (za mrežni red) ili <endian.h> (za opštu upotrebu).
#include <arpa/inet.h> // Za htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Konverzija iz host reda u mrežni (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Konverzija iz mrežnog (Big Endian) u host red
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}