Sobes.tech
Junior

Τι γνωρίζετε για τις σημειώσεις Big Endian, Little Endian και Middle Endian;

sobes.tech AI

Απάντηση από AI

Big Endian: το πιο σημαντικό (το πιο αξιόλογο) byte ενός πολυ-byte αριθμού τοποθετείται στη χαμηλότερη διεύθυνση μνήμης, και το λιγότερο σημαντικό byte στη μεγαλύτερη. Little Endian: το λιγότερο σημαντικό byte ενός πολυ-byte αριθμού τοποθετείται στη χαμηλότερη διεύθυνση μνήμης, και το πιο σημαντικό byte στη μεγαλύτερη. Middle Endian: δεν αποτελεί ευρέως αποδεκτή σημειογραφία. Μερικές φορές αναφέρεται σε περιπτώσεις όπου η σειρά των bytes διαφέρει από το Big Endian και το Little Endian, π.χ., κατά την επεξεργασία πολυ-byte αριθμών σε μπλοκ 2 bytes.

Παράδειγμα για έναν 4-byte αριθμό 0x12345678:

Διεύθυνση Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

Οι περισσότερες σύγχρονες επεξεργαστές (Intel, AMD) χρησιμοποιούν το Little Endian. Τα πρωτόκολλα δικτύου, γενικά, χρησιμοποιούν το Big Endian (γνωστό και ως "διεύθυνση byte δικτύου").

Ο έλεγχος της endianness του συστήματος μπορεί να γίνει ως εξής:

#include <iostream>

int main() {
    int x = 1;
    // Δημιουργία δείκτη σε byte και έλεγχος του πρώτου byte του αριθμού 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Για μετατροπή μεταξύ των σειρών bytes στην C++, χρησιμοποιούνται οι συναρτήσεις από τις κεφαλίδες <arpa/inet.h> (για τη σειρά δικτύου) ή <endian.h> (περισσότερο γενικές).

#include <arpa/inet.h> // Για htons, htonl, ntohs, ntohl

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

    // Μετατροπή από σειρά του υποδοχέα σε σειρά δικτύου (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Μετατροπή από σειρά δικτύου σε σειρά του υποδοχέα
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}