Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207637
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 09:41
文章分类
文章存档

2020年(1)

2018年(1)

2017年(30)

2016年(30)

2015年(3)

我的朋友

分类: LINUX

2017-01-05 15:14:15


移植一个项目,从MIPS到X86。

很多细节的地方都及时继续进行修改了。最后在功能验证的时候,总是发现端口不对,但是实际解析的时候有没有什么问题。没办法,只要详细的打印传递给函数的端口值,结果一看,传给接口函数的端口值就不对。通常这种问题我会优先考虑字节序的问题,于是乎就将端口值转换成十六进制,然后高低字节交换之后,再转成十进制一看,正好就是实际的端口值。原来是字节序的问题。

分析了一下移植前的代码,才发现MIPS上的代码在做端口以及IP地址的比较时,都是直接比较,而不做任何的转换。当时看的时候还比较纳闷,现在明白了,MIPS本身是big-endian的,和网络字节序是一样的。因此,在MIPS平台上存储的主机字节序和网络字节序是移植的。因此,如果本地存储了一个端口值,需要和skb中记录的值相比较的时候,直接比较就可以了,不用考虑字节序的转换问题。

不过,这样的做法,很显然不具有较好的一致性,这个在我移植的项目中已经体现出来了。从可移植性上来讲,不应该对主机字节序做任何假设,即使你知道当前的系统是little-endian或者big-endian。一旦存在主机字节序和网络字节序比较的时候,要么将网络字节转换成主机字节序,要么主机字节序转换成网络字节序。实际上,如果主机字节序和网络字节序一致的话,转换函数的内部就不做真正的转换工作了。

这是可移植性中一个小小的方面,平时开发项目过程中,还有很多方面需要注意可移植性。
                                           -------------------Godbach于2009年11月24日
阅读(1369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~