关于C#:Signed Integer网络和主机转换

Signed Integer Network and Host Conversion

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

我正在寻找一个可以在Linux和Mac OS X上运行的例程。


没关系。 htonl与字节有关,与数字的算术值无关。如果需要的话,使用reinterpret_cast将数字更改为unsigned,然后再次返回。


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

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

在任何一种方法中,每个系统上都有一个数字,而另一个则无法表示;您需要确定在收到此号码后应该采取什么适当的措施。


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

1
2
3
uint16_t __builtin_bswap16 (uint16_t x);
uint32_t __builtin_bswap32 (uint32_t x);
uint64_t __builtin_bswap64 (uint64_t x);

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

1
bswap   %eax