Τι γνωρίζετε για τις σημειώσεις 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;
}