巧妙运用大小端与共用体

今天遇到一个问题

题目描述:

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

功能:解析IPv4地址

测试用例:

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

printf("%x\n",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\n",ip_addr);
    return 0;
}

运行结果:

image

转载于:https://www.cnblogs.com/WindSun/p/11319728.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值