Sobes.tech
Junior

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;
}