Cosa sai delle notazioni Big Endian, Little Endian e Middle Endian?
sobes.tech AI
Risposta dell'AI
Big Endian: il byte più significativo di un numero multibyte viene posizionato all’indirizzo di memoria più basso, mentre il byte meno significativo viene posizionato a quello più alto. Little Endian: il byte meno significativo di un numero multibyte viene posizionato all’indirizzo di memoria più basso, mentre il byte più significativo viene a quello più alto. Middle Endian: non è una notazione ampiamente accettata. A volte si riferisce a casi in cui l’ordine dei byte differisce da Big Endian e Little Endian, ad esempio nel trattamento di numeri multibyte in blocchi di 2 byte.
Esempio per un numero di 4 byte 0x12345678:
| Indirizzo | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
La maggior parte dei processori moderni (Intel, AMD) utilizza Little Endian. I protocolli di rete, di norma, usano Big Endian (chiamato "ordine dei byte di rete").
Per verificare l’endianness del sistema si può fare così:
#include <iostream>
int main() {
int x = 1;
// Creiamo un puntatore a byte e guardiamo il primo byte del numero 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Per convertire tra ordini di byte in C++ si usano le funzioni degli header <arpa/inet.h> (per l’ordine di rete) o <endian.h> (più generali).
#include <arpa/inet.h> // Per htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Conversione dall’ordine di host a quello di rete (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Conversione dall’ordine di rete a quello di host
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}