问题标签 [htonl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
709 浏览

ios - 在 iPhone 上使用 ntohl 和 htonl 问题

我有一个 NSDATA 对象,我创建它然后通过网络发送。我无法从收到的 NSDATA 流中获取正确的值。

这是一些重现我的问题的快速代码。无需网络传输。

我正在使用 NSDATA 类别来简化流程。这是类别代码:

woaInt8AtOffset 效果很好并显示 4 和 6。 woaInt32AtOffset 显示一些巨大的数字。

代码有什么问题?

0 投票
1 回答
411 浏览

c - TCP 套接字:何时不需要 ntoh/hton 转换?

我正在使用现有代码,union ibv_gid通过 TCP 连接传递数据而不转换字节序。里面有一条评论:"The gid will be transfer byte by byte so no need to do "hton"。代码是正确的并且有效,但我不明白为什么数据是逐字节传递的(实际上它们传递了整个结构)以及为什么不需要字节序转换。他们传递的数据类型是:

** 对于其他数据类型(如 int 等),它们会在前后转换数据

你能解释一下为什么不需要字节序转换吗?感谢您的任何帮助

0 投票
1 回答
103 浏览

c - 通过套接字传输数组时遇到问题

我在 c 中通过套接字传输 int 数组时遇到问题。htonl() 的正确用法是什么?可以说我有:

和名为 new_socket 的套接字

我如何正确地将其传输到套接字的另一端?

客户端正在通过以下代码读取它:

0 投票
2 回答
301 浏览

c - htonl/ntohl 第二个命令的值不正确?

编辑:老实说,我不知道错误发生在哪里,所以我将添加大部分相关代码,不确定这是否有帮助

所以基本上我有两个基本的服务器和客户端进程。用户指定一个命令,客户端进程然后将消息的长度发送给服务器,服务器执行命令并返回响应的消息长度。

这在第一个命令上效果很好(我连续尝试了两个 ls -la),第一个命令的值为 1028(正确的值),第二个命令的值为 1685223288(在客户端)不正确

使用以下代码完成写入:

读取在客户端进程中通过以下方式完成:

我的问题:为什么我在第一个命令之后收到错误的值?, 我已经验证了在两种情况下,totalSize 在服务器端都具有正确的值并打印。写/读一定有问题?

我还在服务器上打印了 htonl(totalSize),它是 67371008。但是在客户端收到的值是 ntohl 之前的 2021093988。

0 投票
1 回答
106 浏览

c++11 - 有人可以给出将主机字节顺序转换为网络字节顺序的伪代码的实际实现吗

在以下链接中提到了稳定的伪代码。我想在 C++ 中实现它。我无法理解和执行这些 signof 和 exponentof 以及 mantissaof 操作。

如何在主机和网络字节顺序之间转换双精度?

0 投票
1 回答
14754 浏览

c++ - 何时以及如何使用 C++ htonl 函数

对于我关于堆栈溢出的第一篇文章:我们应该什么时候使用该htonl函数?我已经浏览了手册页。但是,我真的不明白何时以及如何使用它。

0 投票
2 回答
1012 浏览

c++ - 是否存在任何统一函数而不是 htons htonl

我正在尝试新的 C++ 套接字编程。我在理解 htons、htonl 和相关函数的功能时遇到了一些困难。我阅读了一些文件,但我的问题仍然如下,

对于单个服务器和单个客户端,我在两端都使用 htons 作为端口号,并且代码工作正常。即使我不使用这些功能并且我的两个服务器客户端都是基于 Intel 的 64 位机器,代码也可以正常工作。但是如果多个客户端尝试连接我的服务器并且客户端使用不同的数据存储格式怎么办。例如,x86 是 little-endian,而 ARM A-53 是 little-endian 和 big-endian 等,其中一些是 32 位、16 位或 64 位等。我的服务器是 64 位。所以我现在很困惑我必须使用哪些功能统一服务于所有目的?或者,我必须始终检测客户端类型并将其数据格式(端口号)转换为 64 位(因为我的服务器是 64 位),然后使用 htonl() 函数到达服务器。

0 投票
0 回答
298 浏览

cross-platform - 与平台无关的 htonl() 函数和 little endian 上的 >> 运算符

我试图理解以下独立于平台的 htonl() 代码:

我做了一个例子,希望有人能证实我的假设是正确的。

假设我们在地址 100 有 0x 4A 3B 2C 1D。在 BE 机器上它看起来像

地址:字节值

100:4A

101:3B

102:2C

103:一维

在 LE 机器上,它看起来像

地址:字节值

100:一维

101:2C

102:3B

103:4A

现在我们调用 htonl() 并存储地址 500 的结果

在 BE 上:

地址:字节值

500:4A

501:3B

502:2C

503:一维

在 LE 上:

地址:字节值

500:4A

501:3B

502:2C

503:一维

因此,为 BE 调用 htonl() 没有任何净效果,而 LE 则颠倒了字节顺序。

现在是 htonl() 代码。让我们从 for 循环中进行第一次迭代 (i=0)。

我的假设是:

对于 BE 系统:

(uint8_t)(val >> 24) 会将值为 4A 的字节从地址 100 移动到 >address 103

V[0] 是地址 500

对于 LE 系统:

(uint8_t)(val >> 24) 会将值为 4A 的字节从地址 103 移动到地址 100(因此从 BE 的角度来看,这将是左移)。

V[0] 是地址 500——这是有效的,因为 v[8] 是 uint8_t。如果 v 是 uint64_t 那么 v[0] 将是地址 503 并且 htonl() 对 LE 也没有影响。

有了这些假设,我可以理解正在发生的事情,但我的假设是否正确?

感谢阅读……</p>

0 投票
1 回答
348 浏览

c - 从 void * 转换为使用 htonl

我在结构中有一个 void * 值,我需要通过套接字将它发送到服务器。我知道我需要使用

但编译器抛出错误

我还尝试将 void * 转换为 int,但没有用,我使用了

但这也引发了错误。如何将 void * 转换为正确的数据类型?

旁注:由于我正在编写框架,因此该结构不可编辑。

0 投票
2 回答
965 浏览

sockets - htonl 和 htons 字节顺序转换

我是套接字编程的新手,我想到了这个网络字节转换机制htonshtonl方法。
文档说他们将 16 位或 32 位网络号从主机网络字节顺序转换为互联网字节顺序
,所以当主机和网络共享相同顺序时会发生什么
以及如何确定是否应该使用他们与否?

提前问候