NetworkByteOrder是否与Big endian相同?

时间:2019-04-16 02:30:49

标签: c sockets network-programming

我创建了一个演示以证明网络字节顺序与big endian相同:

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

该程序在x86(轻量字节序)Windows PC上运行,并提供输出:

nbo is same as big endian

我在教科书或教程中没有看到此内容,因此我想确认是否正确。

顺便说一句,我认为帮助理解网络中的字节顺序非常重要。为什么大多数问题只集中在“大端与小端”上?

1 个答案:

答案 0 :(得分:2)

是的。您可以在Endianness

上的Wikipedia文章中阅读它。
  

Big-endian是数据网络中最常见的格式; Internet协议套件的协议中的字段(例如IPv4,IPv6,TCP和UDP)以大端顺序传输。因此,big-endian字节顺序也称为网络字节顺序

您通常不需要知道网络字节顺序是大字节序还是小字节序。只需使用ntohXhtonX宏,它将做正确的事情。如果您使用的硬件具有与网络协议相同的字节顺序,则它将不理会该值。如果您使用相反字节顺序的计算机,它将交换字节。