Sobes.tech
Junior

Que savez-vous des notations Big Endian, Little Endian et Middle Endian?

sobes.tech IA

Réponse de l'IA

Big Endian : le byte le plus significatif d’un nombre multibyte est placé à l’adresse mémoire la plus basse, et le byte le moins significatif à la plus haute. Little Endian : le byte le moins significatif d’un nombre multibyte est placé à l’adresse mémoire la plus basse, et le plus significatif à la plus haute. Middle Endian : ce n’est pas une notation largement acceptée. Parfois, elle désigne des cas où l’ordre des bytes diffère de Big Endian et Little Endian, par exemple lors du traitement de nombres multibyte en blocs de 2 bytes.

Exemple pour un nombre de 4 bytes 0x12345678 :

Adresse Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

La majorité des processeurs modernes (Intel, AMD) utilisent Little Endian. Les protocoles réseau, en général, utilisent Big Endian (appelé "ordre des bytes réseau").

Pour vérifier l’endianness du système, on peut faire ainsi :

#include <iostream>

int main() {
    int x = 1;
    // Créer un pointeur sur un byte et regarder le premier byte du nombre 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Pour convertir entre ordres de bytes en C++, on utilise des fonctions des en-têtes <arpa/inet.h> (pour l’ordre réseau) ou <endian.h> (plus général).

#include <arpa/inet.h> // Pour htons, htonl, ntohs, ntohl

int main() {
    uint16_t host_short = 0x1234;
    uint32_t host_long = 0x12345678;

    // Conversion de l’ordre de l’hôte à l’ordre réseau (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Conversion de l’ordre réseau (Big Endian) à l’ordre de l’hôte
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}