我创建了一个演示以证明网络字节顺序与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
我在教科书或教程中没有看到此内容,因此我想确认是否正确。
顺便说一句,我认为帮助理解网络中的字节顺序非常重要。为什么大多数问题只集中在“大端与小端”上?
答案 0 :(得分:2)
是的。您可以在Endianness
上的Wikipedia文章中阅读它。Big-endian是数据网络中最常见的格式; Internet协议套件的协议中的字段(例如IPv4,IPv6,TCP和UDP)以大端顺序传输。因此,big-endian字节顺序也称为网络字节顺序。
您通常不需要知道网络字节顺序是大字节序还是小字节序。只需使用ntohX
和htonX
宏,它将做正确的事情。如果您使用的硬件具有与网络协议相同的字节顺序,则它将不理会该值。如果您使用相反字节顺序的计算机,它将交换字节。