如何将IP地址字符串转换为数字数组

article/2025/10/13 10:53:18

如何将IP地址字符串转换为数字数组

最近在做一个项目用到LWIP,通过触摸屏幕上的数字键盘输入要设置的IP地址和网关地址,然后再用输入的地址去设置重新设置lwip。那么问题就来了,输入的IP地址字符串应该怎么去转换成 ip[4] 数组呢?受限于自己的敲BUG水平,终于在网上找到了大佬写的比较简洁且容易理解的代码

这是大佬的原来的代码,包括IPV4,IPV6,以及MAC地址的字符串转数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define     ipaddr      "192.16.100.20"         // dotted decimal
#define     ip6addr     "2019:1255:1232::1:1"     // colon hexadecimal
#define     macaddr     "00-11-22-33-44-FF"int macstr_parse(const char *point, unsigned char result[6]) {for (int i = 0; i < 6; i++) {result[i] = 0xfe;}char buf[18] = {0}, p = 0, q = 0;strcpy(buf, point);buf[strlen(point)] = '-';for(int i = 0;i < 6; i++) {q = strchr(buf+p, '-') - buf;buf[q] = '\0';result[i] = strtol(buf+p, NULL, 16);p = q + 1;}return 1;
}int ip6str_parse(const char *point, unsigned int result[4]) {for (int i = 0; i < 4; i++) {result[i] = 0;}char buf[40] = {0}, revbuf[40], p = 0, q = 0;strcpy(buf, point);strcpy(revbuf, point);strrev(revbuf);buf[strlen(point)] = ':';revbuf[strlen(point)] = ':';for(int i = 0;i < 8; i++) {q = strchr(buf+p, ':') - buf;buf[q] = '\0';if (i % 2 == 0) {result[i/2] = 0;result[i/2] = strtol(buf+p, NULL, 16)<<16;} else {result[i/2] += strtol(buf+p, NULL, 16);}p = q + 1;// if we find  ::, then we should scan revbuf.2019:1::1 1::1:2019if (buf[p] == ':') {p = q = 0;for (int j = 7;j > i;j--) {q = strchr(revbuf+p, ':') - revbuf;revbuf[q] = '\0';strrev(revbuf+p);if (j % 2 == 0) {result[j/2] += strtol(revbuf+p, NULL, 16)<<16;} else {result[j/2] = 0;result[j/2] += strtol(revbuf+p, NULL, 16);}p = q + 1;if (revbuf[p] == ':') {break;}}break;}}return 1;
}int macstr_parse(const char *point, unsigned char result[6]) {for (int i = 0; i < 6; i++) {result[i] = 0xfe;}char buf[18] = {0}, p = 0, q = 0;strcpy(buf, point);buf[strlen(point)] = '-';for(int i = 0;i < 6; i++) {q = strchr(buf+p, '-') - buf;buf[q] = '\0';result[i] = strtol(buf+p, NULL, 16);p = q + 1;}return 1;
}

来说一下我的项目,是一个这样的界面
在这里插入图片描述

因为我的项目中不仅需要将字符串转换,还需要对输入的字符串进行判断,对于输入有误的地址直接返回错误,防止用错误的IP来设置lwip。所以我对大佬的代码进行了修改,以下是我修改后的代码

/*** @brief 检测IP地址输入是否正确,如果正确就将地址转换数字数组存放在addr中,并返回0,*        如果不正确就返回-1* @param Addr_s IP地址字符串* @param Addr_n   地址数组* @return uint8_t 检查正确返回0, 错误返回1*/
uint8_t addr_check(const char *Addr_s, uint16_t *Addr_n)
{char buf[18] = {0};uint16_t temp;char p_head = 0, p_tail = 0;    //字符串头指针和尾指针//先将addr数组里的值清空for (int i = 0; i < 4; i++) {*(Addr_n + i) = 0;}strcpy(buf, Addr_s);            //拷贝字符串buf[strlen(Addr_s)] = '.';for(int i=0; i<4; i++){//头指针和尾指针的用法:例如"192.",头指针指向'1',尾指针指向'.'if(buf[p_head] == '\0'){return 1;   //如果头指针指向元素为'\0',返回错误}p_tail = strchr(buf+p_head, '.') - buf; //确保地址的每一个数字都有,且不能超过3位if((p_tail-p_head) == 0 || (p_tail-p_head) > 3){           return 1;}//将尾指针指向的'.'替换为'\0',用atoi函数转换成数字buf[p_tail] = '\0';temp = strtol(buf+p_head, NULL, 10);if(temp > 255){   //如果地址值大于255,返回错误return 1;}*(Addr_n + i) = temp;//头指针指向下一位p_head = p_tail + 1;}return 0;
}

参考文章链接:<https://blog.csdn.net/z7________/article/details/107796029


http://chatgpt.dhexx.cn/article/lisWxy1Z.shtml

相关文章

IP地址字符串和数组相互转换

需求描述&#xff1a; 将字符串“192.168.2.126”&#xff0c;转成Byte类型&#xff0c;存放在字节数组中。数组内容为 192,168,2&#xff0c;126。反之亦然。 实现方法&#xff1a; 通过C# 库中的IPAddress类完成。 IPAddress类 对应的命名空间是using System.Net; 实现代…

花3个月面过华为测开岗,拿个30K不过分吧?

计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在一家初创…

华为OD德科面试+机试记录

一、机试&#xff08;6.25&#xff09; 三道编程题&#xff0c;难度偏中。由于时间久远&#xff0c;只记得其中两道题目 1、找车位&#xff08;动态规划&#xff09; 2、题目不记得了&#xff0c;后面如果找到会补充&#xff08;双指针&#xff09; 3、高效的任务规划&#x…

准备4个月过华为测试岗,拿个23k应该不多吧

我大学是学的编程专业&#xff0c;写代码能力非常一般&#xff0c;之前有一个学校项目经验和两段实习。第一份实习是在进大三之前的暑假在广州一家软件公司做前端&#xff0c;第二份实习时大三暑假两个月在一家刚创业的公司做全栈。 我面试的是测试开发&#xff0c;在2022年初…

vSphere Client连接主机提示远程服务器响应时间过长

问题现象 使用VMware vSphere Client连接EXSi主机时&#xff0c;提示“由于远程服务器响应时间过长&#xff0c;请求失败&#xff08;操作超时&#xff09;”。 解决方法 打开Windows注册表&#xff0c;找到HKEY_CURRENT_USER\Software\VMware\VMware Infrastructure Clien…

官网下载eclipse出现mirror.kakao.com 的响应时间过长+解决方法

Eclipse官网:https://www.eclipse.org/downloads/ 问题&#xff1a;官网下载eclipse出现mirror.kakao.com 的响应时间过长 原因&#xff1a;防火墙导致 解决:选择下载国内的镜像 详细过程如下&#xff1a; 每次下载都出现类似下图这样无法访问页面的界面 出现这个的原因大概…

火狐浏览器打开网页显示服务器响应时间过长,网站测试响应时间太长怎么办

有时候通过第三方工具测试服务器的响应时间会很长&#xff0c;而单独创建一个测试站点响应时间又很短。 如用户在http://seo.chinaz.com/ 这里测试的结果。 以下为一个测试出来响应时间较长的站点&#xff1a; 这种情况该怎么办呢&#xff0c;一般来说这种情况并不是网络原因&a…

阿里云服务器部署SpringBoot项目访问响应时间过长的解决

重在解决项目部署完成后的浏览器访问响应时间过长的问题&#xff0c;供SpringBoot项目运行在Centos7的linux系统参考。 安全组 想要在输入地址www.xxxx.top或者ip地址访问不加&#xff1a;[端口] 需要在阿里云的服务器控制台设置安全组&#xff1a; 1.首先点击你的控制台服务…

一次线上java应用响应时间过长问题的排查

最近接手一个老java应用&#xff0c;没多久接到响应时间太长的报警&#xff0c;整个排查过程还是挺有意思的&#xff0c;记录一下。 整个过程中&#xff0c;设计到cpu&#xff0c;内存&#xff0c;垃圾回收&#xff0c;引用&#xff0c;spring, 单例 等等知识&#xff0c;整个下…

阿里云服务器部署项目正常启动,但是访问项目时报响应时间过长

目录 1.问题描述 2.解决办法 1.问题描述 本人使用阿里云部署项目时&#xff0c;将jar包传到服务器中并成功启动后&#xff0c;访问项目时一直报响应时间过长 2.解决办法 这种情况可能是因为阿里云服务器中安全组策略的对应端口没有开放&#xff0c;修改一下就行了&#xff0…

asp.net MVC项目,localhost响应时间过长解决办法

1、vs打开很慢&#xff0c;浏览器如下&#xff1a; 2、那就很可能是IIS问题嘛&#xff0c;IIS重启了一下&#xff0c;还是不行&#xff0c;在地址栏输入localhost&#xff0c;如下图(本人win10系统)&#xff0c;明显IIS也没问题。 3、我们的项目没问题&#xff0c;IIS也没问题&…

解决Chrome 账户登录时,网页显示响应时间过长

解决Chrome 账户登录时&#xff0c;网页显示响应时间过长 chrome 想要开启同步功能&#xff0c;登录Chrome账户时网页显示 响应时间过长 通过此文章https://blog.csdn.net/m0_38020436/article/details/112859777解决了这个问题&#xff0c;于是顺手将过程记录下来。 一、下…

解决github.com 的响应时间过长

github.com 的响应时间过长 windows系统打开目录 C:\Windows\System32\drivers\etc 找到host文件&#xff0c;右键-属性&#xff0c;把只读取消勾选。 利用一下任一网站查询github.com的IP地址 站长之家 http://ip.tool.chinaz.com/github.com 便民查询网 https://ip.51240.co…

网站响应时间过长怎么回事 解决方法都有哪些

网站响应时间过长怎么回事?解决方法都有哪些?很多人在完成HTML5和CSS3部分的学习之后,都要独立完成网页制作项目实践,在这个过程中有部分同学发现网页打开很慢,即网站响应时间过长。针对这​个问题,千锋老师给大家分享几种比较好的解决方法。 网站响应时间是什么? 网站…

为什么我的接口响应时间这么长?记一次接口响应时间过长问题排查

一、情况描述 某saas应用&#xff0c;在请求一个接口的时候&#xff0c;发现响应时间非常的慢&#xff0c;利用前台google浏览器的F12调试&#xff0c;发现响应时间超过2秒 二、问题排查 项目整体采用前后端分离&#xff0c;前端通过nginx实现负载转发&#xff0c;请求后端接…

计算机网络(六):链路层

文章目录 1. 概述2. 差错检测和纠正技术3. 多路访问链路和协议3.1 信道划分协议3.2 随机接入协议3.2.1 ALOHA协议3.2.2 CSMA 3.3 轮流协议 4. 交换局域网4.1 MAC地址4.2 以太网4.2.1 以太网帧结构 4.3 链路层交换机4.3.1 交换机转发和过滤4.3.2 链路层交换机的性质 5. 无线网络…

网络层、链路层理解

1.网络层和链路层关系 2.网络层 路由器 其实计算机本身就有路由器的功能&#xff0c;路由器可以理解成专用的特化简化型计算机&#xff0c;因此数据包的第一次转发发生在计算机本身。这也是为什么在不用路由器&#xff0c;纯交换机组局域网的时候&#xff0c;IP地址也会被需…

链路层协议——以太网协议

以太网协议 一、以太网帧格式二、ARP协议2.1 协议格式2.2 作用2.3 工作流程2.4 ARP局域网欺骗攻击 三、MTU对于上层协议的影响3.1 TCP协议的影响3.2 UDP协议的影响 链路层协议主要是负责相邻设备之间的数据传输。 一、以太网帧格式 max地址&#xff1a;网卡设备的物理硬件地址&…

链路层交换机及和路由器的比较

文章目录 前言一、交换机转发和过滤二、帧来到交换机可能发生的情况三、自学习三、链路交换机的性质四、交换机和路由器比较 前言 交换机的任务是接收入链路层帧并将它们转发到出链路;交换机自身对子网中的主机和路由器是透明的;这就是说&#xff0c;某主机/路由器向另一个主机…