Sobes.tech
Junior

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;
}