主机字节序和网络字节序列

主机字节序和网络字节序列

大端小端的定义
 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));

你可能感兴趣的:(linux,c/c++,linux服务器编程学习笔记)