首页 文章

签名整数的Endian转换

提问于
浏览
3

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

我真的有两个问题:

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

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

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

谢谢

2 回答

  • 0

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

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

    做这个:

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

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

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

  • 12

    我同意,使用ntoh(),hton()等 .

相关问题