问题标签 [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 投票
3 回答
11708 浏览

c - htons中的混乱-小端/大端

当我通过套接字从一个进程向另一个进程发送一个整数变量,然后在接收端打印该值时,不使用ntohl/htonl,该值仍然相同,那么除了初始化套接字结构之外,我还需要在哪里使用这些函数。我理解小/大端。但是为什么我们需要在值保持不变的情况下将端口和 IP 号转换为主机/网络字节顺序。请详细解释整数是如何通过网络传输的?

0 投票
3 回答
6146 浏览

java - c++ 服务器 htons 到 java ntohs 客户端转换

我正在创建一个小型 TFTP 客户端服务器应用程序,其中服务器使用 c++ 开发,客户端使用 java 开发。

在这里,我使用 htons转换发送“块计数”值。

但我无法将其转换回客户端的原始值。

例如,如果我正在 ntohs(01)从服务器向客户端发送块计数(2 个字节)。客户端正在读取字节。我收到的值是字节 0 和字节 1。

请如果有人可以提供解决方案。

0 投票
3 回答
20252 浏览

c# - ntohs() 和 ntohl() 等效?

C# 中有网络到主机的转换函数吗?谷歌搜索并没有找到太多。:P

0 投票
7 回答
47881 浏览

c++ - C++ 中是否有任何适用于 64 位整数的“标准”htonl 函数?

我正在研究 memcache 协议的实现,该协议在某些时候使用 64 位整数值。这些值必须以“网络字节顺序”存储。

我希望有一些uint64_t htonll(uint64_t value)功能可以进行更改,但不幸的是,如果它存在,我找不到它。

所以我有1或2个问题:

  • 是否有任何可移植(Windows、Linux、AIX)标准功能来做到这一点?
  • 如果没有这样的功能,你将如何实现它?

我想到了一个基本的实现,但我不知道如何在编译时检查字节序以使代码可移植。因此,这里非常欢迎您的帮助;)

谢谢你。


这是我写的最终解决方案,感谢布赖恩的解决方案。

0 投票
2 回答
12754 浏览

sockets - 如何将 sockaddr_in6::sin6_addr 字节顺序设置为网络字节顺序?

我开发一个网络应用程序并使用套接字 API。

我想设置 sockaddr_in6 结构的 sin6_addr 字节顺序。

对于 16 位或 32 位变量,很简单:使用 htons 或 htonl:

但是对于 128 位变量,我不知道如何将字节顺序设置为网络字节顺序:

有些答案可能是使用 htons 8 次(2 * 8 = 16 字节),或者使用 htonl 4 次(4 * 4 = 16 字节),但我不知道哪种方式是正确的。

谢谢。

0 投票
3 回答
6303 浏览

c - 主机到网络双重?

我想通过网络发送一些双精度浮点数。(标准 C,标准套接字)没有 htond 或 ntohd 将数据与网络字节顺序进行转换。我该怎么办?我脑子里有几个解决方案,但我想知道常见的做法是什么。

(我也想知道发送 64 位整数的常见做法是什么,比如 gstreamer 使用的 gint64 值)

编辑:这是我想到的一种解决方案。我认为它适用于任何大小的整数,但它适用于双精度数吗?

0 投票
3 回答
2349 浏览

c - 可移植的 C 二进制序列化原语

据我所知,C 库在将数值序列化为非文本字节流方面没有提供任何帮助。如我错了请纠正我。

使用中最标准的工具是htonl来自 POSIX 的 et al。这些功能有缺点:

  • 没有 64 位支持。
  • 没有浮点支持。
  • 没有签名类型的版本。反序列化时,无符号到有符号的转换依赖于有符号整数溢出,即 UB。
  • 它们的名称没有说明数据类型的大小。
  • 它们取决于 8 位字节和精确大小 uint_N_t 的存在
  • 输入类型与输出类型相同,而不是引用字节流。
    • 这需要用户执行指针类型转换,这可能是不安全的对齐方式。
    • 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这是一种糟糕的做法,会导致意外错误。

用于将任意大小序列化为char8 位标准字节的接口介于 C 标准之间,该标准并不真正承认 8 位字节,而任何标准(ITU?)都将八位字节设置为基本的传输单元。但是旧的标准没有得到修订。

现在 C11 有许多可选组件,二进制序列化扩展可以与线程之类的东西一起添加,而不需要对现有实现提出要求。

这样的扩展会有用吗,还是担心非二进制补码机器就没有意义?

0 投票
1 回答
4567 浏览

python - Python和C之间ntohl和htonl的行为不同

我试图在 Python 中模仿 C 程序的某些部分的行为。他们都在读取一个二进制文件,其中每条记录都是长度->数据。C 程序将从文件中提取长度字节,无论是正数还是负数,ntohl() 都会返回正确的长度。然而,在 Python 中,即使长度记录是相同的值,当它是负数时,我会得到一个溢出错误:

长度:419495936

ntohl: 281

长度:-2147418112

溢出错误:无法将负数转换为无符号长

与 C 相比:

长度:419495936

ntohl: 281

长度:-2147418112

ntohl: 384

我在这里做错了什么?如何让 Python 产生与 C 相同的结果?

用代码编辑

这是C代码:

这是Python:

0 投票
2 回答
2893 浏览

c - 2字节短成C中的2字节字符串?

在该短片上使用 htons 后,任何将 2 字节短片(普通短片)转换为 2 字节字符串(char*)的方法。问题是 htons 方法返回一个 int(4 个字节),我如何将它放入一个 2 个字节的字符串?

注意:我需要能够对结果使用 ntohs 来获得原始值。

感谢您的建议:D

0 投票
5 回答
10409 浏览

c++ - IPv6下的网络字节顺序没有意义吗?

如果我们使用 32 位整数来存储 IPv4 地址,那么必须考虑整数的字节顺序。

但是,由于几乎所有平台下都没有内置的 128 位整数类型,因此 IPv6 地址必须存储到字节数组中,所以,我认为字节顺序不再是问题。

我对么?或者 IPv6 有对应的函数 htonlXXX 吗?