2009-12-05 97 views
2

我通过UDP接收大端数据并将其转换为小端。源代码说整数是有符号的,但是当我交换有符号整数(特别是16位)的字节时,我会得到不切实际的值。当我将它们作为未签名的整数交换时,我得到了我期望的结果。我想源文档可能不正确,实际上是发送无符号的16位整数。但为什么这很重要?这些值都应该是正值,并且低于16位INT_MAX,所以溢出不应该成为问题。我唯一能想到的是(1)文档是错误的(2)当我执行带符号的字节替换时,我没有正确处理符号位。带符号整数的末端转换

我真的有两个问题:

1)当溢出不是一个问题,它不管我读入符号或无符号整数。

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

我认为endian转换对于有符号值和无符号值看起来都是一样的,例如,为16位value = value&0xff00 >> 8 | value&0x00ff << 8

谢谢

+1

什么编程语言? – bmargulies 2009-12-05 20:33:56

+0

希望你已经得到括号(如果它是C)。 – 2009-12-05 20:43:01

回答

12

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

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

做到这一点:

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

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

最后,不要自己写这个函数,你应该使用ntohs()

+3

ntohs不是一个通用的c库函数,而是来自(bsd)套接字库的函数。该死的有用,但有点奇怪拉入套接字库以获得endian实用程序功能:P – 2009-12-05 20:54:25

+3

当您已经在进行UDP通信时使用套接字函数并不奇怪。 – 2009-12-05 21:04:09

+0

这也适用于无符号值吗? – MarcusJ 2016-09-28 16:27:53

相关问题