当前位置: 首页 > news >正文

C语言将点分十进制的IP字符串转成4个整数

最近在做lldp的snmp返回值时需要做这样的转换处理:C语言将点分十进制的IP字符串转成4个整数。

这里用两种方式:

  1. sscanf格式化处理
  2. 用 inet_aton函数将ip字符串转成32位的整形,然后再根据bit转成对应的4个整数。
  • man命令可以确认下sscanf和inet_aton的返回值,以确认处理成功还是失败。
  • 字节序问题:inet_aton后统一用网络字节序,避免出错。

sscanf

#include <stdio.h>// 1 succeed, 0 failed
int parse_ip_sscanf(const char *ip_str, int *a, int *b, int *c, int *d) {return sscanf(ip_str, "%d.%d.%d.%d", a, b, c, d) == 4;
}int main() {// 定义点分十进制的 IP 字符串const char *ip_str = "192.168.1.1";// 定义变量存储解析结果int a, b, c, d;if (0 == parse_ip_sscanf(ip_str, &a, &b, &c, &d)) {printf("parse_ip_sscanf failed\n");} else {printf("parse done: %d %d %d %d\n", a, b, c, d);}return 0;
}

inet_aton + ntol

#include <stdio.h>
#include <arpa/inet.h>#define u8 unsigned char// 1 succeed, 0 failed
int parse_ip_inet_aton(const char *ip_str, int *a, int *b, int *c, int *d) {u8 *p = NULL;in_addr_t ip_int;if (inet_aton(ip_str, (struct in_addr *)&ip_int) == 0) {return 0;  // 解析失败}p = (u8 *)&ip_int;*a = p[0];*b = p[1];*c = p[2];*d = p[3];return 1;  // 解析成功
}int main() {// 定义点分十进制的 IP 字符串const char *ip_str = "192.168.1.1";// 定义变量存储解析结果int a, b, c, d;if (0 == parse_ip_inet_aton(ip_str, &a, &b, &c, &d)) {printf("parse_ip_sscanf failed\n");} else {printf("parse done: %d %d %d %d\n", a, b, c, d);}return 0;
}

哪个效率高点?

这里用的是固定的字符串跑的测试,不太严谨。。。可以考虑随机生成1~255的数字组成ip字符串,然后再跑下测试。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>#define TEST_COUNT 1000000  // 测试次数// 使用 sscanf 解析 IP 地址
int parse_ip_sscanf(const char *ip_str, int *a, int *b, int *c, int *d) {return sscanf(ip_str, "%d.%d.%d.%d", a, b, c, d) == 4;
}// 使用 inet_aton 解析 IP 地址
int parse_ip_inet_aton(const char *ip_str, int *a, int *b, int *c, int *d) {in_addr_t ip_int;if (inet_aton(ip_str, (struct in_addr *)&ip_int) == 0) {return 0;  // 解析失败}ip_int = ntohl(ip_int);*a = (ip_int >> 24) & 0xFF;*b = (ip_int >> 16) & 0xFF;*c = (ip_int >> 8) & 0xFF;*d = ip_int & 0xFF;return 1;  // 解析成功
}int main() {// 定义点分十进制的 IP 字符串const char *ip_str = "192.168.1.1";// 定义变量存储解析结果int a, b, c, d;// 记录失败的次数int sscanf_fail_count = 0;int inet_aton_fail_count = 0;// 测试 sscanf 方式clock_t start = clock();for (int i = 0; i < TEST_COUNT; i++) {if (0 == parse_ip_sscanf(ip_str, &a, &b, &c, &d)) {sscanf_fail_count++;}}clock_t end = clock();double sscanf_time = (double)(end - start) / CLOCKS_PER_SEC;printf("sscanf 方式耗时: %.6f 秒\n", sscanf_time);printf("sscanf 方式失败次数: %d\n", sscanf_fail_count);// 测试 inet_aton 方式start = clock();for (int i = 0; i < TEST_COUNT; i++) {if (0 == parse_ip_inet_aton(ip_str, &a, &b, &c, &d)) {inet_aton_fail_count++;}}end = clock();double inet_aton_time = (double)(end - start) / CLOCKS_PER_SEC;printf("inet_aton 方式耗时: %.6f 秒\n", inet_aton_time);printf("inet_aton 方式失败次数: %d\n", inet_aton_fail_count);// 比较两种方式的效率if (sscanf_time < inet_aton_time) {printf("sscanf 方式更快,效率高出 %.2f 倍\n", inet_aton_time / sscanf_time);} else {printf("inet_aton 方式更快,效率高出 %.2f 倍\n", sscanf_time / inet_aton_time);}return 0;
}/*
sscanf 方式耗时: 0.104025 秒
sscanf 方式失败次数: 0
inet_aton 方式耗时: 0.027499 秒
inet_aton 方式失败次数: 0
inet_aton 方式更快,效率高出 3.78 倍
*/

修改ip随机生成一百万次,测试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>#define TEST_COUNT 1000000  // 测试次数// 生成一个随机的合法 IP 地址字符串
void generate_random_ip(char *ip_str) {sprintf(ip_str, "%d.%d.%d.%d",rand() % 256, rand() % 256, rand() % 256, rand() % 256);
}// 使用 sscanf 解析 IP 地址
int parse_ip_sscanf(const char *ip_str, int *a, int *b, int *c, int *d) {return sscanf(ip_str, "%d.%d.%d.%d", a, b, c, d) == 4;
}// 使用 inet_aton 解析 IP 地址
int parse_ip_inet_aton(const char *ip_str, int *a, int *b, int *c, int *d) {in_addr_t ip_int;if (inet_aton(ip_str, (struct in_addr *)&ip_int) == 0) {return 0;  // 解析失败}ip_int = ntohl(ip_int);*a = (ip_int >> 24) & 0xFF;*b = (ip_int >> 16) & 0xFF;*c = (ip_int >> 8) & 0xFF;*d = ip_int & 0xFF;return 1;  // 解析成功
}int main() {// 初始化随机数种子srand(time(NULL));// 定义变量存储解析结果int a, b, c, d;// 记录失败的次数int sscanf_fail_count = 0;int inet_aton_fail_count = 0;// 动态分配堆空间存储 IP 地址数组char (*ip_array)[16] = malloc(TEST_COUNT * sizeof(*ip_array));if (ip_array == NULL) {printf("内存分配失败!\n");return 1;}// 随机生成 IP 地址数组for (int i = 0; i < TEST_COUNT; i++) {generate_random_ip(ip_array[i]);}// 测试 sscanf 方式clock_t start = clock();for (int i = 0; i < TEST_COUNT; i++) {if (!parse_ip_sscanf(ip_array[i], &a, &b, &c, &d)) {sscanf_fail_count++;}}clock_t end = clock();double sscanf_time = (double)(end - start) / CLOCKS_PER_SEC;printf("sscanf 方式耗时: %.6f 秒\n", sscanf_time);printf("sscanf 方式失败次数: %d\n", sscanf_fail_count);// 测试 inet_aton 方式start = clock();for (int i = 0; i < TEST_COUNT; i++) {if (!parse_ip_inet_aton(ip_array[i], &a, &b, &c, &d)) {inet_aton_fail_count++;}}end = clock();double inet_aton_time = (double)(end - start) / CLOCKS_PER_SEC;printf("inet_aton 方式耗时: %.6f 秒\n", inet_aton_time);printf("inet_aton 方式失败次数: %d\n", inet_aton_fail_count);// 比较两种方式的效率if (sscanf_time < inet_aton_time) {printf("sscanf 方式更快,效率高出 %.2f 倍\n", inet_aton_time / sscanf_time);} else {printf("inet_aton 方式更快,效率高出 %.2f 倍\n", sscanf_time / inet_aton_time);}return 0;
}/*
sscanf 方式耗时: 0.116505 秒
sscanf 方式失败次数: 0
inet_aton 方式耗时: 0.043936 秒
inet_aton 方式失败次数: 0
inet_aton 方式更快,效率高出 2.65 倍
*/

相关文章:

C语言将点分十进制的IP字符串转成4个整数

最近在做lldp的snmp返回值时需要做这样的转换处理&#xff1a;C语言将点分十进制的IP字符串转成4个整数。 这里用两种方式&#xff1a; sscanf格式化处理用 inet_aton函数将ip字符串转成32位的整形&#xff0c;然后再根据bit转成对应的4个整数。 man命令可以确认下sscanf和i…...

go语言学习 笔记 1(变量,语法,数据类型)

1,包管理 一个文件夹可以称为一个包 在一个包里面可以创建多个文件 包中可以创建包 同一个包内的同一级的包的名字要相同 如:包a中的包b.包b中的包得是同一个package,a中和包b同级的包名字也得是一个名字 必须要有一个main包,入口,就像是c必须有一个main函数 如果没有mai…...

无网络时自动切换备用网络环境

目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境&#xff0c;我电脑使用网线连接稳定但低速的网络A&#xff0c;使用WiFi连接高速但不稳定的网络B。因此&am…...

电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)

电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思&#xff0c;今天小编就来普及一下。 32位和64位是指电脑处理器&#xff08;CPU&#xff09;和操作系统的架构&#xff0c;决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...

系统思考—结构影响行为

前段时间&#xff0c;我遇到了一位健康食品初创公司的创始人&#xff0c;产品质量毋庸置疑&#xff0c;但销量却始终打不开局面&#xff0c;资金链也日渐紧绷。他一脸困惑地问我&#xff1a;“我们已经尽力了&#xff0c;为什么结果还是不如人意&#xff1f;”经过深入交流&…...

【算法不挂科】算法期末考试【选择题专项练习】<多单元汇总>

前言 大家好吖&#xff0c;欢迎来到 YY 滴算法不挂科系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 下面是相关传送门 【算法不挂科】算法期末考试题库1&#xff08;带解析&#xff09;【选择题53道&#xff06;填空题36道&#xff06;算法填空题7道&a…...

2025.1.8(c++对c语言的扩充——堆区空间,引用,函数)

笔记 上一笔记接续&#xff08;练习2的答案&#xff09; 练习&#xff1a;要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和d…...

如何将Yum源修改为本地挂载的ISO镜像

要将yum源修改为本地挂载的ISO镜像,您可以按照以下步骤进行操作。假设您使用的是CentOS或类似的基于Red Hat的Linux发行版,且已经将ISO镜像文件挂载到系统中。 步骤一:挂载ISO镜像 创建一个挂载点: 首先,您需要创建一个目录来作为ISO镜像的挂载点。例如: sudo mkdir /mnt…...

salesforce如何在系统里保存密码

在 Salesforce 中&#xff0c;保存密码或类似敏感信息时&#xff0c;不应以明文形式存储&#xff0c;而应采用安全的加密和存储机制。以下是一些最佳实践和实现方法&#xff1a; 1. 使用 Salesforce 提供的加密机制 Salesforce 提供了一些内置的加密工具&#xff0c;可以用来加…...

函数提升+上下文+内存清理及释放

文章目录 函数提升上下文函数释放拓展-垃圾回收机制垃圾回收之触发应用 函数提升上下文 函数提升&#xff08;Hoisting&#xff09; 概念&#xff1a;在JavaScript中&#xff0c;函数声明会被提升到当前作用域的顶部。这意味着可以在函数声明之前调用函数。例如&#xff1a; sa…...

计算机网络之---计算机网络的性能评估

计算机网络的性能评估是指通过各种标准和指标来衡量网络的工作效率和质量&#xff0c;进而对网络进行优化和改进的过程。评估的目标是确保网络能够满足预期的服务质量&#xff08;QoS&#xff09;和性能需求。常见的计算机网络性能评估指标包括带宽、延迟、吞吐量、丢包率等。 …...

Unity学习之UGUI进阶

一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 &#xff08;1&#xff09;常用事件接口 &#xff08;2&#xff09;不常用事件接口 3、使用事件监听接口 &#…...

深度学习领域创新黑马!频域特征融合新突破

最近&#xff0c;FreqFusion引起了广泛关注&#xff0c;这是一种创新的频率感知特征融合方法&#xff0c;可以提升数据处理的准确性和效率&#xff0c;尤其在语义分割、目标检测、实例分割和全景分割等任务中表现卓越。 通过结合频域分析与特征融合技术&#xff0c;FreqFusion…...

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…...

用Cline打造你的智能搜索助手:Tavily Search MCP集成指南

引言 本文将详细介绍如何在Cline编辑器中集成Tavily Search智能搜索功能。我们将从MCP&#xff08;Model Context Protocol&#xff09;协议基础开始&#xff0c;深入探讨Tavily Search MCP服务器的安装配置、使用方法&#xff0c;以及进阶的二次开发技巧。无论你是AI开发者还…...

HTML+CSS+JS制作中华传统美食主题网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个中华传统文化主题网站&#xff0c;包含首页、菜系页、食材页、名厨页、美食故事页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅导航区 包含网站Logo、搜索栏、主导航菜单&#xff0…...

黄仁勋CES 2025演讲重点内容

黄仁勋CES 2025演讲重点内容 硬件产品发布 GeForce RTX 50系列GPU&#xff1a; 架构与性能提升&#xff1a;正式发布的新一代GeForce RTX 50系列GPU采用英伟达旗舰的Blackwell架构&#xff0c;这是自25年前引入可编程着色技术以来计算机图形领域最重大的创新。该系列显卡在图形…...

TVbox 手机、智能电视节目一网打尽

文章目录 一、简要介绍二、优点三、下载地址 一、简要介绍 TVbox是目前最火爆的多端、多源的电视影音工具&#xff0c;是一款开源的自定义添加站源的影音工具。TVBox&#xff0c;支持电视频道直播。一款TV端影视工具&#xff0c;软件本身不具有任何影视资源&#xff0c;但可以…...

sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)

文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…...

kubesphere前端源码运行

一、下载源码 源码是react&#xff0c;下载地址是 GitHub - kubesphere/console at v3.3.2 然后直接用git下拉就可以了 下拉完成后差不多是这样一个目录结构&#xff0c;记得切分支到3.3.2 二、下载依赖 1、node & yurn 想要运行源码首先需要node&#xff0c;使用刚才…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...