/*********************************************************************
* Author : Samson
* Date : 03/10/2014
* Test platform:
* Linux ubuntu 3.2.0-58-generic-pae
* GNU bash, version 4.2.39
* *******************************************************************/
大端小端的问题在不同平台间的问题比较严重,一个平台支持大端的,而另一端支持小端的,这样就存在大于一个字节的数据结构的内存存储形式不是一致的,若是要使用htonl htons ntohl ntohs 这四个函数的话,那么需要知道不同平台间的cpu是支持大端还是小端的,大端的为网络序,关于如何判断大端或小端的方法,可参照,有的时候在支持大端的设备上调用这4个函数的结果是一样的,这个其实是在此函数的实现中有对平台进行了判断,所以结果还是和没有处理前是一样的.
这种情况如何解决呢? 因为大端小端涉及到的是大于一个字节的数据,那么可以进行移位操作把多字节的数据拆分成多个单字节,在接收端再进行移位操作把拆分的多个单字节进行组合,这样就能够很好的解决这个问题。
例子:把一个short类型的数值转换为两个char
short aa = 0x1256;
char datalen1, datalen2;
datalen1 = aa & 0x00ff;
datalen2 = (aa & 0xff00) >> sizeof(char);
struct send_ctrl_t
{
char data_len1;
char data_len2;
};
把两个char转换回一个short类型数值
int get_short_fromchar(send_ctrl_t *modctr)
{
int datalen = 0;
datalen = modctr->data_len1;
datalen = (unsigned short)(datalen << 8) ;
datalen = datalen | ((unsigned short)modctr->data_len2);
return datalen;
}