Wat weet u over de notaties Big Endian, Little Endian en Middle Endian?
sobes.tech AI
Antwoord van AI
Big Endian: het meest significante (hoogste) byte van een meerbytegetal wordt geplaatst op het laagste geheugenadres, en de minst significante byte op het hoogste. Little Endian: de minst significante byte van een meerbytegetal wordt geplaatst op het laagste geheugenadres, en de meest significante byte op het hoogste. Middle Endian: is geen algemeen aanvaarde notatie. Soms wordt het gebruikt om gevallen aan te duiden waarin de bytevolgorde afwijkt van Big Endian en Little Endian, bijvoorbeeld bij het verwerken van meerbytegetallen in blokken van 2 bytes.
Voorbeeld voor een 4-byte getal 0x12345678:
| Adres | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
De meeste moderne processors (Intel, AMD) gebruiken Little Endian. Netwerkprotocollen gebruiken meestal Big Endian (de zogenaamde "netwerkvolgorde").
Om de endianness van het systeem te controleren, kan je het zo doen:
#include <iostream>
int main() {
int x = 1;
// Maak een pointer naar een byte en controleer de eerste byte van het getal 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Voor het converteren tussen bytevolgordes in C++ worden functies uit <arpa/inet.h> (voor netwerkvolgorde) of <endian.h> (meer algemeen) gebruikt.
#include <arpa/inet.h> // Voor htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Omzetten van hostvolgorde naar netwerkvolgorde (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Omzetten van netwerkvolgorde naar hostvolgorde
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}