我正在使用 Winsock 开发网络应用程序应用程序接口(interface)。每当我测试应用程序以发送数组中的几个字节时:
char[0] = '1';
char[1] = '2';
char[2] = '3';
char[3] = '4';
char[4] = '\0';
我使用 send和 recv套接字接收本地主机上运行的另一个应用程序上的字节,然后字节顺序似乎根本没有改变。仅仅是因为我在本地主机服务器上测试它吗?网络字节顺序是否会更改为:
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/