当前位置:  开发笔记 > 程序员 > 正文

签名整数的Endian转换

如何解决《签名整数的Endian转换》经验,为你挑选了1个好方法。

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

我真的有两个问题:

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

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

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

谢谢



1> Greg Hewgill..:

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

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

做这个:

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

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

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


ntohs不是一般的c库函数,而是来自(bsd)套接字库的函数.该死的有用,但有点奇怪的是拉入套接字库以获得endian实用程序功能:P
当你已经在进行UDP通信时,使用套接字函数并不奇怪.
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有