C 为什么没有长时间的套接字ntol?

C 为什么没有长时间的套接字ntol?,c,sockets,C,Sockets,如果我想通过网络传输有符号长(32位整数),我该怎么做?若我以有符号的long发送,那个么在另一端,我将不知道(可能)远程机器如何表示有符号的数字?那我该怎么办呢?因为ntohl()是按字节顺序操作的,所以它不太关心符号,只关心有多少位。回答标题中的问题 要回答“我该怎么做?”这个问题,除了说明你在问这个问题——你把它转换成无符号,然后再转换回另一个符号,因为除了不知道它是否有符号之外,任意遥控器也不知道这个数字是关于什么的,您的特定遥控器可能更了解这个问题。如果两个系统对负整数使用不同的表示(

如果我想通过网络传输有符号长(32位整数),我该怎么做?若我以有符号的long发送,那个么在另一端,我将不知道(可能)远程机器如何表示有符号的数字?那我该怎么办呢?

因为
ntohl()
是按字节顺序操作的,所以它不太关心符号,只关心有多少位。回答标题中的问题


要回答“我该怎么做?”这个问题,除了说明你在问这个问题——你把它转换成无符号,然后再转换回另一个符号,因为除了不知道它是否有符号之外,任意遥控器也不知道这个数字是关于什么的,您的特定遥控器可能更了解这个问题。

如果两个系统对负整数使用不同的表示(例如,两个补码、符号大小),则将数字作为字符串传输,并在接收器上将其解析为整数。虽然效率不高,但除非你传输大量的数字,否则就没什么大不了的。如果有许多数字要传输,可以使用某种形式的压缩

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


在这两种方法中,每个系统上都有一个无法在另一个系统上表示的数字;你需要决定在收到这个号码时应该采取什么样的行动。

只需使用
ntohl
htonl
并在
uint32_t
int32_t

之间进行转换或隐式转换,告诉他们如何解释。确定的可能重复,所以我想我可以按原样发送只要我将其标记为有符号,那么在另一端,我将执行必要的转换。如果编译器坚持,您可以在执行
htonl
之前将其转换为
unit32\u t
,并在通过
ntohl
处理后将其转换为有符号。根据POSIX,整数类型
intN\u t
必须是两个补码。
ntohl
函数是POSIX的一部分。@DietrichEpp:ISO C还要求它们是两个补码,最负的值才有效(不是陷阱)。将整数转换为字符串再转换回来听起来效率很低。