我通过UDP接收大端数据并将其转换为小端 . 源代码表示整数是有符号的,但是当我交换有符号整数的字节(特别是16位)时,我会得到不切实际的值 . 当我将它们作为无符号整数交换时,我得到了我的期望 . 我想源文档可能不正确,实际上是发送无符号的16位整数 . 但为什么会这么重要?这些值都应该是正的,并且在16位INT_MAX下,因此溢出不应该是一个问题 . 我唯一能想到的是(1)文档错误和(2)当我执行签名的endian交换时,我没有正确处理符号位 .
我真的有两个问题:
1)当溢出不成问题时,我是否读入有符号或无符号的整数是否重要 .
2)有符号值和无符号值之间的字节序交换是否不同(即符号位是否需要以不同方式处理)?
我认为有符号和无符号值的字节序转换看起来相同,例如对于16位 value = value&0xff00 >> 8 | value&0x00ff << 8
.
谢谢
2 回答
您在交换功能中遇到了符号扩展问题 . 而不是这样做:
做这个:
问题是如果
value
是16位有符号值,则0xabcd >> 8
是0xffab
. 如果在有符号的右移中开始为1,则最高有效位保持为1 .最后,不要自己编写这个函数,而应该使用
ntohs()
.我同意,使用ntoh(),hton()等 .