2013-05-09 69 views
0

我在下面的网络比喻有点糊涂:字节表示 - 网络原始数据

考虑我传递一个指针Winsock发送()函数序列化的结构(与整数)。

我的英特尔机器上,这些4个字节的整数可以在大端机器上用不同的方式来表示和误解时,结构上的另一边重新创建。

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

如果没有办法避免它 - 我怎么会用,而不必这一问题通过网络发送原始数据结构的工作吗?

回答

0

你应该为你选择数据的网络格式,这种格式指定每个字节(例如,你可以使用大尾数为整数4个字节代表),然后写转换器/从这种格式为每一种平台的你程序运行在。

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

+0

那么你的意思是像网络字节顺序? – 2013-05-09 12:55:21

+0

这正是他的意思。 – 2013-05-09 13:12:16

0

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

自1980-1990年代以来,最常见的机器(至少可能连接到某种网络的机器)恰好是“大端”,这是当时的选择,当然,我们现在不能改变它,只是因为时代已经改变了,因为那需要删除所有依赖于它的顺序的现有代码。

当然,如果您只使用您的软件将数据发送到其他机器,那么您可以按照自己喜欢的方式进行操作 - 这是您的数据,打包方法和软件。只要两端具有相同的使用顺序的想法。如果你想发送数据到一个不是你自己的协议,那么你需要遵循协议规定的字节顺序。

它确实只是一个“自定义”的问题。我们必须有一个标准,否则我们不能在不同的基础架构的机器之间发送数据。如果不同的制造商(或型号)根据“当时的感受”将制动踏板置于不同的位置,就会对大多数人开车时驾驶汽车的能力造成破坏 - 假设必须记住是否应该将脚在左侧,中间或右侧踏板走得慢些?