签名整数网络和主机转换

时间:2011-02-02 19:12:53

标签: c unix integer signed endianness

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

我希望找到适用于Linux和Mac OS X的例程。

3 个答案:

答案 0 :(得分:7)

没关系。 htonl关注字节,而不是数字的算术值。如果必须,请使用reinterpret_cast将数字更改为无符号,然后再返回。

答案 1 :(得分:2)

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

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

在任何一种方法中,每个系统上都会有一个号码无法在另一个号码上表示;你需要在收到这个号码时决定适当的行动方案。

答案 2 :(得分:1)

如果你正在使用gcc,它有一组builtins用于此目的。他们通常编译成一条指令。

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