Шумо дар бораи нотасияҳои 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;
// Создайте ишора ба байт ва аввалин байти рақами 1-ро санҷед (0x00000001)
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;
}