• Linux网络编程--字节序



    1 .谈到字节序,那么会有朋友问什么是字节序
    非常easy:【比如一个16位的整数。由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序的问题。】


    2 .那么什么是高字节、低字节?
    也相当简单:【一个16进制整数有两个字节组成,比如:0xA9。


    高字节就是指16进制数的前8位(权重高的8位),如上例中的A。


    低字节就是指16进制数的后8位(权重低的8位),如上例中的9。


    大于一个字节的变量类型一般有两种表示方法:
    这里写图片描写叙述
    比如:变量0xabcd在大端字节序和小端字节型系统中表示方法如图
    这里写图片描写叙述
    我们用代码验证一下我们自己的系统是小端还是大端吧
    这里写图片描写叙述

    #include <stdio.h>
    
    /* 联合类型的变量类型。用于測试字节序
    *   成员value的高低端字节能够由成员type按字节訪问
     */
    typedef union{
        unsigned short int value;                               /*短整型变量*/
        unsigned char byte[2];                              /*字符类型*/
    }to;
    
    int main(int argc, char *argv)
    {   
        to typeorder ;                                      /*一个to类型变量*/
        typeorder.value = 0xabcd;                               /* 将typeorder变量赋值为0xabcd */
    
        /* 小端字节序检查 */
        if(typeorder.byte[0] == 0xcd && typeorder.byte[1]==0xab){       /*低字节在前*/
            printf("Low endian byte order"
                    "byte[0]:0x%x,byte[1]:0x%x
    ",
                    typeorder.byte[0],
                    typeorder.byte[1]); 
        }
    
        /* 大端字节序检查 */
        if(typeorder.byte[0] == 0xab && typeorder.byte[1]==0xcd){       /*高字节在前*/
            printf("High endian byte order"
                    "byte[0]:0x%x,byte[1]:0x%x
    ",
                    typeorder.byte[0],
                    typeorder.byte[1]); 
        }
    
        return 0;   
    }
    

    3 .字节序转换函数介绍
    这里写图片描写叙述

    字节序转换函数的使用:

    #include <stdio.h>
    
    /* 联合类型的变量类型,用于測试字节序
    *   成员value的高低端字节能够由成员type按字节訪问
     */
    /* 16位 */
    typedef union{
        unsigned short int value;
        unsigned char byte[2];  
    }to16;
    /* 32位 */
    typedef union{
        unsigned long int value;
        unsigned char byte[4];  
    }to32;
    
    #define BITS16 16   /*16位*/
    #define BITS32 32   /*32位*/
    /* 依照字节打印,begin为字节開始,
    *  flag为BITS16表示16位,
    *  flag为BITS32表示32位。 
    */
    void showvalue(unsigned char *begin, int flag)
    {
        int num = 0, i = 0;
        if(flag == BITS16){
            num = 2;    
        }else if(flag == BITS32){
            num = 4;    
        }
    
        for(i = 0; i< num; i++)
        {
            printf("%x ",*(begin+i));   
        }
        printf("
    ");
    }
    
    int main(int argc, char *argv)
    {   
        to16 v16_orig, v16_turn1,v16_turn2; /*一个to16类型变量*/
        to32 v32_orig, v32_turn1,v32_turn2; /*一个to32类型变量*/
    
    
        v16_orig.value = 0xabcd;        /* 赋值为0xabcd */
        v16_turn1.value = htons(v16_orig.value);/*第一次转换*/
        v16_turn2.value = ntohs(v16_turn1.value);/*第二次转换*/
    
        v32_orig.value = 0x12345678;    /* 赋值为0x12345678 */
        v32_turn1.value = htonl(v32_orig.value);/*第一次转换*/
        v32_turn2.value = ntohl(v32_turn1.value);/*第二次转换*/
    
        /* 打印结果 */
        printf("16 host to network byte order change:
    ");  
        printf("	orig:	");showvalue(v16_orig.byte, BITS16);   /* 16位数值的原始值 */
        printf("	1 times:");showvalue(v16_turn1.byte, BITS16); /* 16位数值的第一次转换后的值 */
        printf("	2 times:");showvalue(v16_turn2.byte, BITS16); /* 16位数值的第二次转换后的值 */
    
        printf("32 host to network byte order change:
    ");
        printf("	orig:	");showvalue(v32_orig.byte, BITS32);   /* 32位数值的原始值 */
        printf("	1 times:");showvalue(v32_turn1.byte, BITS32); /* 32位数值的第一次转换后的值 */
        printf("	2 times:");showvalue(v32_turn2.byte, BITS32); /* 32位数值的第二次转换后的值 */
    
    
        return 0;   
    }
    
  • 相关阅读:
    TCP协议的常见面试题
    Fedora 31 Beta 发布
    教你玩转Git-合并冲突
    使用Python搭建http服务器
    如何在Linux中复制文档
    小知识:讲述Linux命令别名与资源文件的区别
    centos7配置nfs共享存储服务
    30个关于Shell脚本的经典案例(中)
    轻量级前端MVVM框架avalon
    轻量级前端MVVM框架avalon
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6994773.html
Copyright © 2020-2023  润新知