Является ли NetworkByteOrder таким же, как Big endian?

#c #sockets #network-programming

#c #сокеты #сетевое программирование

Вопрос:

Я создаю демонстрацию, чтобы доказать, что сетевой порядок байтов такой же, как и big endian:

 #include "stdio.h"
#include "stdint.h"
#include "winsock2.h"
#define BL32(x)  ((((x) amp; 0x000000ffUL) << 24) | 
                 (((x) amp; 0x0000ff00UL) <<  8) | 
                 (((x) amp; 0x00ff0000UL) >>  8) | 
                 (((x) amp; 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 endiann");
    } else {
        printf("nbo isn't same as big endiann");
    }

    return 0;
}
 

Эта программа работает на ПК с ОС Windows x86 (с небольшим конечным порядком) и выдает выходные данные:

 nbo is same as big endian
 

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

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

Ответ №1:

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

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

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