რა იცით Big Endian, Little Endian და Middle Endian ნოტაციებზე?
sobes.tech AI
პასუხი AI-სგან
Big Endian: უმნიშვნელოვანესი (ძირითადი) ბაიტი მრავალბაიტიანი რიცხვის მდებარეობს მეხსიერების უმცირეს მისამართზე, ხოლო უმცირესი ბაიტი — უმაღლეს. Little Endian: უმცირესი (ძირითადი) ბაიტი მრავალბაიტიანი რიცხვის მდებარეობს მეხსიერების უმცირეს მისამართზე, ხოლო უმაღლესი ბაიტი — უმაღლეს. Middle Endian: არ წარმოადგენს საერთო ნოტაციას. ზოგჯერ მას გულისხმობენ შემთხვევებში, როდესაც ბაიტების სია განსხვავდება BigEndian და LittleEndian-ისგან, მაგალითად, როდესაც მრავალბაიტიანი რიცხვები მუშავდება 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> // For 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);
// გარდაქმნა ქსელურ (Big Endian) წესრიგიდან ჰოსტის წესრიგში
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}