主机字节序和网络字节序列
大端小端的定义
a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址;
b.Big endian 高位存储在内存的低地址,低位存储在内存的高地址;
写代码查看你的网络字节序列
利用union里面的数据共享内存进行测试
void t_order(){
union{
short value;
char union_bytes[sizeof(short)];
}test;
test.value = 0x0102;
printf("p0=%p,p1=%p",&(test.union_bytes[0]),&(test.union_bytes[1]));
if(test.union_bytes[0] == 1 && test.union_bytes[1] == 2 ){
puts("大端");
}else if(test.union_bytes[0] == 2 && test.union_bytes[1] == 1 ){
//0x7fff5fbff788 存储2 0x7fff5fbff789存储1
puts("小端");
}else{
puts("未知");
}
}
网络字节序列默认是大端的,所以需要转换,java虚拟机默认的是大端字节序列
字节序列转换函数
htonl()--"Host to Network Long int" 32Bytes
ntohl()--"Network to Host Long int" 32Bytes
htons()--"Host to Network Short int" 16Bytes
ntohs()--"Network to Host Short int" 16Bytes
看看代码
void t_ntl(){
int a = 0x403214;
int b = htonl(a);
//传输32位
printf("host=%0x,big=%0x,big_t_host=%0x\n",a,b,ntohl(b));
//16
int a2 = 0x1234;
int b2 = htons(a2);
printf("host=%0x,big=%0x,big_t_host=%0x",a2,b2,ntohs(b2));