巧妙运用大小端与共用体

冷不防 2023-08-17 16:43 200阅读 0赞

今天遇到一个问题

题目描述:

实现函数 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码:

  1. int i=192;
  2. unsigned char c=unsigned char(i);

程序如下:

  1. union un
  2. {
  3. int a;
  4. unsigned char b[4];
  5. }myUn;
  6. unsigned int ipnel_parse_ip_addr(const char* ip)
  7. {
  8. int tmp[4];
  9. sscanf(ip,"%d.%d.%d.%d",&tmp[3],&tmp[2],&tmp[1],&tmp[0]);
  10. for (int i = 0; i < 4; i++)
  11. {
  12. myUn.b[i] = unsigned char(tmp[i]);
  13. }
  14. return myUn.a;
  15. }
  16. int main()
  17. {
  18. unsigned int ip_addr = ipnel_parse_ip_addr("192.168.10.1");
  19. printf("%x\n",ip_addr);
  20. return 0;
  21. }

运行结果:

image

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

发表评论

表情:
评论列表 (有 0 条评论,200人围观)

还没有评论,来说两句吧...

相关阅读

    相关 union共用

    union共用体与struct结构体结构类似, 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员

    相关 共用练习

    think: 1可以用二维字符串数组辅助记录每一次输入使用的数据类型 2共用体可以节约内存的申请 3共用体在某一瞬间只能记录存放一种类型成员 4只有先定义了共用

    相关 共用练习

    think: 1可以用二维字符串数组辅助记录每一次输入使用的数据类型 2共用体可以节约内存的申请 3共用体在某一瞬间只能记录存放一种类型成员 4只有先定义了共用