被阴了一把.
做M2M终端协议的时候,报文封装都是按照little-endian来处理的。与服务器那边却总是连不上,后来把数据发过去核对,才发现服务器那边只认big-endian,即所谓的网络序。问题是协议里面并没有明确说明要这样做,没办法,只好再花时间加上htons、ntohs。
在网络上发送数据之前,一般的做法的确是要转换成网络顺序发送。下次在做网络协议时一定要事先弄清楚,切记!
为了保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换 bsd socket提供了转换的函数 有下面四个:
(s -- short l -- long h -- host n -- network)
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.
不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
ARM 全部 Little endian
posted on 2008-08-27 15:07
puppy 阅读(590)
评论(0) 编辑 收藏 引用 所属分类:
杂项