Является ли NetworkByteOrder таким же, как Big endian? - PullRequest
0 голосов
/ 16 апреля 2019

Я создаю демо-версию, чтобы доказать, что сетевой порядок байтов совпадает с порядком байтов:

#include "stdio.h"
#include "stdint.h"
#include "winsock2.h"
#define BL32(x)  ((((x) & 0x000000ffUL) << 24) | \
                 (((x) & 0x0000ff00UL) <<  8) | \
                 (((x) & 0x00ff0000UL) >>  8) | \
                 (((x) & 0xff000000UL) >> 24))
int main(int argc, char* argv[])
{
    uint32_t s = INT_MAX; // little endian
    uint32_t network = htonl(s);
    uint32_t bigendian = BL32(s);
    if(network == bigendian) {
        printf("nbo is same as big endian\n");
    } else {
        printf("nbo isn't same as big endian\n");
    }

    return 0;
}

Эта программа работает на ПК с Windows x86 (litte endian) и выдает:

nbo is same as big endian

Я не видел, чтобы это упоминалось в учебнике или учебном пособии, поэтому я хочу подтвердить, правильно это или нет.

Кстати, я думаю, что очень важно помочь понять, каков порядок байтов в сети. Почему большая часть вопроса сконцентрирована только на "big против little endian" ...

1 Ответ

2 голосов
/ 16 апреля 2019

Да, это так. Вы можете прочитать его в статье в Википедии Endianness

Big-endian - самый распространенный формат в сети передачи данных; поля в протоколах набора протоколов Интернета, такие как IPv4, IPv6, TCP и UDP, передаются в порядке с прямым порядком байтов. По этой причине порядок байтов с прямым порядком байтов также упоминается как порядок сетевых байтов .

Как правило, вам не нужно знать, является ли сетевой порядок байтов старшим или младшим. Просто используйте макросы ntohX и htonX, и все будет правильно. Если вы используете оборудование с тем же порядком байтов, что и сетевые протоколы, оно оставит значение в покое; если вы работаете на машине с противоположным порядком байтов, он поменяет местами байты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...