socket 通信 Windos 和 Linux之间 Big endian 和 little endian的转换策略

Big endian 和 little endian

本次测试仅仅一32Bits的Intel X86系统和Moto Power PC系统TCP/IP socket connection联调作为讨论内容。
结论如下:

传输某一结构体。
#pragma   pack(4)  
typedef struct{
char name[6];
int age;
char sex;
short tel;
}student;
#pragma   pack()

NBO network byte order 网络字节序
HBO host byte order   主机字节序

1.当peer ends都为X86系统时,两端都是little endian,我们无需关心如何NBO和HBO转换,

发端:
student stu1;
stu1.age = 0x00000304;
memcpy( stu1.name,"abcdef",6);
stu1.sex = 'f';
stu1.tel = 0x0809;

收端:
age=0x304
tel=0x809

value=0X61 addr=0Xbfe6d3f0
value=0X62 addr=0Xbfe6d3f1
value=0X63 addr=0Xbfe6d3f2
value=0X64 addr=0Xbfe6d3f3
value=0X65 addr=0Xbfe6d3f4
value=0X66 addr=0Xbfe6d3f5
value=0X0 addr=0Xbfe6d3f6
value=0X0 addr=0Xbfe6d3f7
value=0X4 addr=0Xbfe6d3f8
value=0X3 addr=0Xbfe6d3f9
value=0X0 addr=0Xbfe6d3fa
value=0X0 addr=0Xbfe6d3fb
value=0X66 addr=0Xbfe6d3fc
value=0X0 addr=0Xbfe6d3fd
value=0X9 addr=0Xbfe6d3fe
value=0X8 addr=0Xbfe6d3ff

2.当peer ends都为Power系统时,两端都是big endian,我们无需关心如何NBO和HBO转换.

3.当一端为Power PC一端为X86时,小端需要做发送前的转换和接受后的转换,而大端不需要.
发送前小端对short型调用htons,对long和int调用htonl.
接受后小端对short型调用ntohs,对long和int调用ntohl.
则可以保证通过调用结构体变量得到的数值是正确的.

亦即发送方age = 0x00000304 ,接受方为也是0x000000304.如果不转化,可能变成0x04030000.

你可能感兴趣的:(socket)