首页 > 解决方案 > 为什么不需要使用 hton/ntoh 函数来发送 const char*?

问题描述

我正在使用套接字通过网络发送数据缓冲区。我看到转换字节序的唯一地方是发送方/接收方的端口号。我可以理解。

我无法理解的是我正在发送一个const char*(使用send()/ sendto(),取决于传输协议)。据我了解,您在 Big Endian 中通过网络传输字节。我的机器是Little Endian。

ntoh()发送时不使用/hton()函数的诀窍是const char*什么?

标签: socketsnetworking

解决方案


背景:big-endian 与 little-endian 的概念仅适用于多字节整数(和浮点值);由于历史原因,不同的 CPU 可能通过不同的字节顺序在内存中表示相同的数字二进制值,因此伯克利套接字 API 的设计者创建ntoh*()并将hton*()CPU 的本机字节顺序(无论可能是什么)转换为“网络标准”格式(他们选择了大端)并返回,以便二进制数可以从一种机器类型传输到另一种机器类型,而不会被接收方的 CPU 误解。

至关重要的是,这种表示的分裂只发生在字节级别之上。即一个 N 字节字内的字节顺序在不同的 CPU 上可能不同,但每个字节内的位顺序总是相同的。

字符串(如 aconst char *所指)是指一系列单独的 8 位字节,所有 CPU 类型都以相同的方式解释字节的顺序,因此无需转换其格式以保持数据兼容性跨 CPU。(请注意,有不同的格式可用于表示字符串,例如 ASCII 与 UTF-8 与 UTF-16 与等,但这是由软件做出的决定,而不是软件运行的 CPU 硬件的特性on;因此,Berkeley 套接字 API 不会尝试解决该问题)


推荐阅读