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



最近我学习了一些Windows套接字编程,以实现一些套接字连接。

在代码中,我们使用一些函数,如htonl()、htons(),将数据从主机字节顺序转换为网络字节顺序,也就是所谓的大端序,因为在一些机器中,数据存储为小端序,就像我所知道的英特尔的CPU一样。

但我困惑的是,真正重要的不是比特顺序而不是字节吗?

因为比特是计算机使用的最小单位,而不是字节。假设我们想通过使用little-endian的机器将一个u_short u=18传递给另一台机器。

在我们的机器中,u的第一个字节,最低有效的是2,第二个字节,最高有效的是1,让我用[2][1]来表达。

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

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

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

从技术上讲,这在很多情况下都适用。比如,如果一台以一个顺序01234567存储位的机器上的硬盘驱动器被转移到一台以相反顺序76543210存储位的计算机上,你可能会想同样的问题,无论它是否能正确读取数据。

但简单的答案是,它总是读取正确,因为用于将硬盘驱动器映射到系统总线的协议指定了比特"呈现"到主机内存时的确切顺序。

网卡和网络硬件有类似的行为:它们在硬件中使用标准化的"比特排序",作为硬件协议的一部分,它以主机期望的任何形式向主机"呈现"这些比特。

当然,"字节排序"是一件单独的事情,而且更难处理,因为网络硬件和存储硬件只识别"字节流"(是的,我过于简单化了),而不太关心这些字节的实际含义。

但就"比特排序"而言,除非你在写"在金属上"的代码,否则你不需要考虑它

最新更新