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