c++ - 本地主机上的网络字节顺序

标签 c++ windows winapi winsock endianness

我正在使用 Winsock 开发网络应用程序应用程序接口(interface)。每当我测试应用程序以发送数组中的几个字节时:

char[0] = '1';
char[1] = '2';
char[2] = '3';
char[3] = '4';
char[4] = '\0';

我使用 sendrecv套接字接收本地主机上运行的另一个应用程序上的字节,然后字节顺序似乎根本没有改变。仅仅是因为我在本地主机服务器上测试它吗?网络字节顺序是否会更改为:

char[0] = '\0';
char[1] = '4';
char[2] = '3';
char[3] = '2';
char[4] = '1';

如果我通过互联网接收它?

最佳答案

8 位字符数组和字符串不会受到网络字节顺序问题的影响。由于数组中的每个单独的 char 本身已经按顺序排列,并与数组中的下一个 char 字节一起排序...受到影响的是 short、int 和 long。

此外,执行任何字节交换的不是发送和接收调用。字节交换与处理器如何在内存中布置整数有关:

要了解字节顺序问题,请考虑 Intel 芯片上的以下代码:

// code that demonstrates how integer values are laid out in memory
int msg = 0x01020304;
char* buffer = (char*)&msg;
for (int x = 0; x < 4; x++)
    printf("%d %d %d %d\n", buffer[0], buffer[1], buffer[2], buffer[3]);

打印出来的结果是:

4 3 2 1

这表明 x86 处理器以您可能期望的相反顺序对整数内存字节进行排序。最低有效字节或整数在内存中排在最前面。这是 Little Endian。

在旧的 Sun 工作站等 Sparc 芯片上,打印出相同的代码:

1 2 3 4

这是大字节序。

只有当您将数据写入磁盘或网络时,内存序列的字节顺序才重要。一旦另一台计算机读取另一台计算机写出的字节序列,读取整数的 CPU 就会根据它自己的字节顺序对其进行解释。

在将整数写入文件或流式传输到网络时,字节序通常很重要。在没有应用程序开发人员进行转换的情况下,传递给 send() 的原始缓冲区的传输与处理器在内存中布置字节的方式完全相同。参见 htonl和 friend 们了解有关将整数和短裤与 Big Endian(也称为网络字节顺序)相互转换的更多详细信息。

关于c++ - 本地主机上的网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21202111/

相关文章:

c++ - 如何在 VS2008 中将#define 定义转换为字符串?

c++ - 使用 winapi 获取本地 IP 地址列表

c++ - 使用鼠标拖动旋转 QLabel

c++ - 当你想减小 vector 的大小时,为什么 std::vector::resize() 不释放内存?

c++ - LNK2019 构造函数/析构函数使用 C++ Dll

c++ - 从外部应用程序附加子窗口时的消息循环(泵)

c++ - wchar_t* 到字符串的转换

c++ - 在 win32 下,如何让全局变量在 C++ 中首先被实例化?

c++ - 检查数组中的值 C++

c++ - 为什么不是 "0"== "0"?