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

标签 c++ sockets networking

最近学习了一些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/

相关文章:

java.net.SocketException : Connection reset - Between a client and server deployed as webapps in tomcat 异常

sockets - 什么是地址族?

networking - 网络输入和网络输出在亚马逊中是什么意思?

java - 无法在java中找到while循环行为

java - 通过 LAN 将 DatagramPacket 从一台 PC 发送到另一台 PC

ios - 如何在 NSURLSession 中查找和取消任务?

c++ - int 限制与 long 限制

c# - 有没有办法检查 memcached 是否已重新启动?

c++ - 热键控制键码困惑

c++ - 为什么编译器不能优化0浮点加法?