4

我正在通过 UDP 接收大端数据并将其转换为小端。消息来源说整数是有符号的,但是当我交换有符号整数的字节(特别是 16 位)时,我得到了不切实际的值。当我将它们交换为无符号整数时,我得到了我的期望。我想源文档可能不正确,实际上是在发送无符号的 16 位整数。但是这有什么关系呢?这些值都应该是正数并且远低于 16 位 INT_MAX,因此溢出应该不是问题。我唯一能想到的是(1)文档是错误的并且(2)我在执行有符号字节序交换时没有正确处理符号位。

我真的有两个问题:

1)当溢出不是问题时,我读入有符号或无符号整数是否重要。

2) 有符号值和无符号值之间的字节序交换是否不同(即符号位是否需要以不同方式处理)?

我认为有符号和无符号值的字节序转换看起来相同,例如 16-bit value = value&0xff00 >> 8 | value&0x00ff << 8

谢谢

4

1 回答 1

13

您在交换函数中遇到符号扩展问题。而不是这样做:

value & 0xff00 >> 8 | value & 0x00ff << 8

做这个:

((value >> 8) & 0x00ff) | ((value & 0x00ff) << 8)

问题是如果value是一个 16 位有符号值,那么0xabcd >> 80xffab. 如果在有符号右移中以 1 开始,则最高有效位保持 1。

最后,与其自己编写这个函数,不如使用ntohs().

于 2009-12-05T20:41:44.783 回答