我想将int32_t
主机字节顺序转换为网络字节顺序,反之亦然。我知道该htonl()
函数及其变体,但这需要无符号整数。是否有一个标准库函数可以对有符号整数做同样的事情,还是我必须自己实现它?如果我必须自己实现它,我应该怎么做?
我正在寻找一个适用于 Linux 和 Mac OS X 的例程。
我想将int32_t
主机字节顺序转换为网络字节顺序,反之亦然。我知道该htonl()
函数及其变体,但这需要无符号整数。是否有一个标准库函数可以对有符号整数做同样的事情,还是我必须自己实现它?如果我必须自己实现它,我应该怎么做?
我正在寻找一个适用于 Linux 和 Mac OS X 的例程。
不要紧。htonl 与字节有关,而不与数字的算术值有关。如果必须,请使用 reinterpret_cast 将数字更改为无符号并再次返回。
如果一个系统(你永远不知道什么可能在运行 Linux)可能会使用不同的负整数表示(例如,一个补码、符号大小;罕见但可能),然后将数字作为字符串传输并在接收器上将它们解析为整数. 效率不高,但除非您传输大量数字,否则这并不重要。如果要传输的号码很多,您可以使用某种形式的压缩。
或者,为负数定义您自己的网络表示并编写您自己的 ntohsl 和 htonsl。
在任何一种方法中,每个系统上都会有一个数字不能在另一个系统上表示;收到此号码时,您需要确定适当的行动方案。
如果您使用 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