C++ 字节表示-网络原始数据

C++ 字节表示-网络原始数据,c++,networking,architecture,byte,winsock,C++,Networking,Architecture,Byte,Winsock,我对以下网络类比有点困惑: 假设我正在通过向Winsock send()函数传递指针来序列化结构(使用整数) 在我的英特尔计算机上,这些4字节整数可能在big-endian计算机上以不同的方式表示,并且在另一端重新创建结构时会被误解 这是可以理解的,但有一个问题——所以我想知道——如果在两台机器上运行的两个程序都编译为32位呢?英特尔AMD指令集的自动转换不会像二进制文件那样发生吗 如果无法避免,我如何通过网络发送原始数据结构而不出现此问题?您应该为数据选择网络格式,并指定此格式中的每个字节(例

我对以下网络类比有点困惑:

假设我正在通过向Winsock send()函数传递指针来序列化结构(使用整数)

在我的英特尔计算机上,这些4字节整数可能在big-endian计算机上以不同的方式表示,并且在另一端重新创建结构时会被误解

这是可以理解的,但有一个问题——所以我想知道——如果在两台机器上运行的两个程序都编译为32位呢?英特尔AMD指令集的自动转换不会像二进制文件那样发生吗


如果无法避免,我如何通过网络发送原始数据结构而不出现此问题?

您应该为数据选择网络格式,并指定此格式中的每个字节(例如,您可以对整数使用big-endian 4字节表示),然后针对程序运行的每种平台,将转换器写入/从该格式写入


32/64位、指令集、Intel/AMD的差异与此无关。

请看一本书,他非常清楚地解释了这个问题及其简单的解决方案。即使他为UNIX提供的代码通过更改API调用,您也可以在WinSock中执行此操作。如果你像我一样懒于阅读,请检查一下这个

,因为不同体系结构的机器(不,Intel和AMD没有[足够]不同的体系结构)可能以不同的字节顺序存储数据。由于使用网络的人希望他们的数据以一种可以理解的格式到达,无论是1990年的数字设备VAX、2005年的Sun Sparc还是1996年的AMD 486、2008年的iPhone(ARM)还是2013年的Intel CoreX机器,网络协议都规定订单应以某种方式进行

因为在1980-1990年代,最常见的机器(至少那些可能连接到某种网络的机器)碰巧是“big-endian”,这是当时的选择,当然,我们现在不能仅仅因为时代的变化就改变它,因为这需要撕碎所有依赖于顺序的现有代码

当然,如果你只使用你的软件向其他机器发送数据,那么你可以做你喜欢做的事情——这是你的数据,你的打包方法和你的软件。只要两端对使用哪个顺序有相同的想法。如果您想将数据发送到非您自己的协议,那么您需要遵循该协议关于字节顺序的规定


这实际上只是一个“习惯”的问题。我们必须有一个标准,否则我们不能在不同基础架构的机器之间发送数据。就像如果不同的制造商(或型号)根据“他们当时的感觉”将制动踏板放在不同的位置,这会对大多数人驾驶汽车的能力造成严重破坏一样——想象一下,你必须记住你的脚是应该放在左、中还是右踏板上才能走得更慢

那正是他的意思。