签名整数的Endian转换

时间:2009-12-05 20:32:03

标签: endianness

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

我真的有两个问题:

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

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

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

由于

1 个答案:

答案 0 :(得分:12)

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

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

这样做:

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

问题是,如果value是16位有符号值,则0xabcd >> 80xffab。如果在有符号的右移中开始为1,则最高位保持为1。

最后,不要自己编写此功能,而应使用ntohs()