Ko jūs zināt par Big Endian, Little Endian un Middle Endian notācijām?
sobes.tech AI
Atbilde no AI
Lielā Endian: lielākais (svarīgākais) baitis daudzbaita skaitļa glabājas mazākā atmiņas adresē, bet mazākais baitis — lielākā. Mazā Endian: mazākais (svarīgākais) baitis daudzbaita skaitļa glabājas mazākā atmiņas adresē, bet lielākais baitis — lielākā. Vidējā Endian: nav kopīgi pieņemta notācija. Dažreiz to saprot kā gadījumus, kad baitu secība atšķiras no BigEndian un LittleEndian, piemēram, kad daudzbaita skaitļi tiek apstrādāti 2 baitu blokos.
Piemērs 4 baitu skaitlim 0x12345678:
| Adrese | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Lielākā daļa mūsdienu procesoru (Intel, AMD) izmanto Little Endian. Tīkla protokoli parasti izmanto Big Endian (saukts arī par "tīkla baitu kārtību"). Sistēmas endianness pārbaudi var veikt šādi:
#include <iostream>
int galvenais() {
int x = 1;
// Izveido baitu pointeri un skatās uz pirmo skaitļa baitu (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Baitu secības maiņa C++ tiek veikta, izmantojot funkcijas no <arpa/inet.h> (tīkla kārtība) vai <endian.h> (vispārīgākas).
#include <arpa/inet.h> // For htons, htonl, ntohs, ntohl
int galvenais() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Pārveidošana no host kārtības uz tīkla (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Pārveidošana no tīkla (Big Endian) uz host kārtību
uint16_t atpakaļ uz host_short = ntohs(network_short);
uint32_t atpakaļ uz host_long = ntohl(network_long);
return 0;
}