Ինչ եք իմանում Big Endian, Little Endian և Middle Endian նշանների մասին։
sobes.tech AI
Պատասխան AI-ից
Big Endian: շատբայթային թվի ամենանշանակալին (ամենամեծ) բայթը տեղադրվում է հիշողության ամենացածր հասցեում, իսկ ամենափոքր նշանակության բայթը՝ ամենաբարձր: Little Endian: ամենափոքր նշանակության բայթը տեղադրվում է հիշողության ամենացածր հասցեում, իսկ ամենանշանակալին՝ ամենաբարձր: Middle Endian: լայնորեն ընդունված նշում չէ: Երբեմն այն վերաբերում է դեպքերին, երբ բայթերի կարգը տարբերվում է Big Endian և Little Endian-ներից, օրինակ՝ երբ շատբայթային թվերը մշակվում են 2 բայթանոց բլոկներով:
Օրինակ 4 բայթանոց թիվ 0x12345678 համար:
| Հասցե | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Ամենատարածված պրոցեսորները (Intel, AMD) օգտագործում են Little Endian: Նեթվորկային պրոտոկոլները, որպես կանոն, օգտագործում են Big Endian (որն անվանում են "նետվորկային կարգ" կամ "բայթների կարգ").
Սիստեմի endianness-ը ստուգելու համար կարելի է անել այսպես:
#include <iostream>
int main() {
int x = 1;
// Ստեղծում ենք բայթային ցուցիչ և ստուգում առաջին բայթը
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Բայթների կարգը փոխելու համար 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;
}