9

我想将int32_t主机字节顺序转换为网络字节顺序,反之亦然。我知道该htonl()函数及其变体,但这需要无符号整数。是否有一个标准库函数可以对有符号整数做同样的事情,还是我必须自己实现它?如果我必须自己实现它,我应该怎么做?

我正在寻找一个适用于 Linux 和 Mac OS X 的例程。

4

3 回答 3

7

不要紧。htonl 与字节有关,而不与数字的算术值有关。如果必须,请使用 reinterpret_cast 将数字更改为无符号并再次返回。

于 2011-02-02T19:15:20.517 回答
2

如果一个系统(你永远不知道什么可能在运行 Linux)可能会使用不同的负整数表示(例如,一个补码、符号大小;罕见但可能),然后将数字作为字符串传输并在接收器上将它们解析为整数. 效率不高,但除非您传输大量数字,否则这并不重要。如果要传输的号码很多,您可以使用某种形式的压缩。

或者,为负数定义您自己的网络表示并编写您自己的 ntohsl 和 htonsl。

在任何一种方法中,每个系统上都会有一个数字不能在另一个系统上表示;收到此号码时,您需要确定适当的行动方案。

于 2011-12-03T19:33:41.493 回答
0

如果您使用 gcc,它有一组用于此目的的内置函数。它们通常编译成一条指令。

uint16_t __builtin_bswap16 (uint16_t x);
uint32_t __builtin_bswap32 (uint32_t x);
uint64_t __builtin_bswap64 (uint64_t x);

在我的机器上, __builtin_bswap32() 编译为

bswap   %eax
于 2016-08-18T01:56:37.597 回答