最近学习了一些Windows socket编程,实现了一些socket连接的东西。
在代码中,我们使用一些函数,如 htonl()、htons() 将我们的数据从主机字节顺序转换为网络字节顺序,或所谓的大端,因为在某些机器中数据存储为小端,就像我所知道的英特尔的 CPU。
但我感到困惑的是,真正重要的不是位序而不是字节吗?
因为比特是计算机使用的最小单位,而不是字节。 假设我们想通过一台使用 little-endian 的机器将 u_short u=18 传递给另一台机器。
在我们的机器中,你的第一个字节,最低位是2,第二个字节,最高位是1,我用[2][1]来表示。
所以我们需要先调用 htons(u) 将 [2][1] 转换为 [1][2] 并将其发送到网络。
远端机器会先接收到2,但是2是由 native 实际接收到的0000-0010的比特序列表示的, native 怎么知道这个字节是2呢?它不会认为 0000-0010 代表 64 吗?(0100-0000) 所有机器都以相同的方式存储字节吗?
最佳答案
“位排序”由用于将数据从硬件(如网卡/端口)传输到主机内存的协议(protocol)指定。
从技术上讲,这适用于很多很多情况。比如,您可能想知道同样的问题,如果一台机器上的硬盘驱动器以一种顺序存储位 01234567
转移到一台以相反顺序存储位的机器上 76543210
,是否它会正确读取数据。
但简单的答案是它始终读取正确,因为用于将硬盘驱动器映射到系统总线的协议(protocol)指定了位“呈现”到主机内存时的确切顺序。
网卡和网络硬件具有相似的行为:它们具有在硬件中使用的标准化“位排序”,并且作为硬件协议(protocol)的一部分,它以主机期望的任何形式将这些位“呈现”给主机.
“字节序”当然是一个单独的东西,而且比较难处理,因为网络硬件和存储硬件只识别“字节流”(是的,我过于简单化了),并没有太多关心这些字节的实际含义。
但是就“位序”而言,除非您正在“在金属上”编写代码,否则可以这么说,您不需要考虑它。
关于c++ - 为什么我们不关心位顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41594918/