为什么我们不关心位顺序?

时间:2017-01-11 15:38:13

标签: c++ sockets networking

最近我学会了一些Windows套接字编程来实现一些套接字连接。

在代码内部,我们使用一些函数,如htonl(),htons()将数据从主机字节顺序转换为网络字节顺序,或称为big-endian,因为在某些机器中数据存储为little-endian,就像我所知道的那样,就像英特尔的CPU一样。

但令我困惑的是,真正重要的是位顺序而不是字节?

由于bit是计算机使用的最小单位,而不是字节。 让我们说我们想通过机器使用little-endian将u_short u = 18传递给另一台机器。

在我们的机器中,你的第一个字节,最不重要的一个是2和第二个字节,最重要的一个是1,让我用[2] [1]来表达。

所以我们需要首先调用htons(u)将[2] [1]转换为[1] [2]并将其发送到网络。

远程机器首先接收2,但是2由机器实际接收的位序列表示为0000-0010,机器如何知道该字节是2?不认为0000-0010代表64?(0100-0000)所有机器都以相同的方式存储字节吗?

1 个答案:

答案 0 :(得分:3)

"位排序"由用于将数据从硬件(如网卡/端口)传输到主机内存的协议指定。

从技术上讲,这适用于许多情况。就像,您可能想知道同一个问题,如果一台机器上存储一个订单01234567的位的硬盘传输到一台机器,以相反的顺序存储位76543210,无论它是否读过数据是否正确。

但简单的答案是它总是正确读取,因为用于将硬盘驱动器映射到系统总线的协议指定了位的精确排序,因为它们是“#34;呈现的”#34;托管记忆。

网卡和网络硬件具有类似的行为:它们具有标准化的"位排序"它们在硬件中使用,作为硬件协议的一部分,它提供了#34;以主机期望的任何形式向主机提供这些位。

" Byte Ordering"当然是一个单独的东西,更难以处理,因为网络硬件和存储硬件只能识别"字节流" (是的,我过分简化了),并且不太关心那些字节实际意味着什么。

但就" Bit Ordering"而言,除非您正在编写代码" On the Metal",可以这么说,您不需要考虑它