zoukankan      html  css  js  c++  java
  • 巧妙运用大小端与共用体

    今天遇到一个问题

    题目描述:

    实现函数 unsigned int ipanel_parse_ip_addr(const char*ip)

    功能:解析IPv4地址

    测试用例:

    unsigned int ip addr=ipanel_parse_ip_addr("192.168.10.1");

    printf("%x ",ip_addr);

    要求输出:c0a80a01不允许使用字符串相关库函数

    请在程序关键步骤增加必要注释。

    分析:

    首先在函数中ipanel_parse_ip_addr要将点分十进制字符串中的数字解析出来,然后将其存储一个大小为4的共用体中,将整数转换为ascii码,因为char只能到127,如果ip中的数字大于了127,就要用unsigned char,共用体中定义一个unsigned char [4]的数组,以及一个int型变量,将解析出来的数字转换为ascII的值,然后存储到unsigned char [4]数组中,因为Linux和windows的机器都是小端模式的,所以第一个值要存储在下标为3,第四个值要存储在0下标,然后再将共用体中的int型变量a以十六进制输出,就可以得到结果。

    要点:

    将一个int型整数转换为这个值的ascii码:

    int i=192;
    unsigned char c=unsigned char(i);

    程序如下:

    union un
    {
        int a;
        unsigned char b[4];
    }myUn;
    
    unsigned int ipnel_parse_ip_addr(const char* ip)
    {
        int tmp[4];
        sscanf(ip,"%d.%d.%d.%d",&tmp[3],&tmp[2],&tmp[1],&tmp[0]);
        
        for (int i = 0; i < 4; i++)
        {
            myUn.b[i] = unsigned char(tmp[i]);
        }
        return myUn.a;
    }
    
    int main()
    {
        unsigned int ip_addr = ipnel_parse_ip_addr("192.168.10.1");
        printf("%x
    ",ip_addr);
        return 0;
    }

    运行结果:

    image

  • 相关阅读:
    设计模式 || 观察者模式
    并发问题的源头—原子性、可见性、有序性。
    设计模式 || 适配器模式
    JAVA线程池的创建与使用
    JVM垃圾收集算法之清除算法
    JVM垃圾收集算法之标记算法
    ajax入门简介
    Junit测试入门
    JVM&G1 GC 学习笔记(一)
    HTTPS学习总结
  • 原文地址:https://www.cnblogs.com/WindSun/p/11319728.html
Copyright © 2011-2022 走看看