C语言将点分十进制的IP字符串转成4个整数
最近在做lldp的snmp返回值时需要做这样的转换处理:C语言将点分十进制的IP字符串转成4个整数。
这里用两种方式:
- sscanf格式化处理
- 用 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返回值时需要做这样的转换处理:C语言将点分十进制的IP字符串转成4个整数。 这里用两种方式: sscanf格式化处理用 inet_aton函数将ip字符串转成32位的整形,然后再根据bit转成对应的4个整数。 man命令可以确认下sscanf和i…...
go语言学习 笔记 1(变量,语法,数据类型)
1,包管理 一个文件夹可以称为一个包 在一个包里面可以创建多个文件 包中可以创建包 同一个包内的同一级的包的名字要相同 如:包a中的包b.包b中的包得是同一个package,a中和包b同级的包名字也得是一个名字 必须要有一个main包,入口,就像是c必须有一个main函数 如果没有mai…...
无网络时自动切换备用网络环境
目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境,我电脑使用网线连接稳定但低速的网络A,使用WiFi连接高速但不稳定的网络B。因此&am…...
电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)
电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...
系统思考—结构影响行为
前段时间,我遇到了一位健康食品初创公司的创始人,产品质量毋庸置疑,但销量却始终打不开局面,资金链也日渐紧绷。他一脸困惑地问我:“我们已经尽力了,为什么结果还是不如人意?”经过深入交流&…...
【算法不挂科】算法期末考试【选择题专项练习】<多单元汇总>
前言 大家好吖,欢迎来到 YY 滴算法不挂科系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 下面是相关传送门 【算法不挂科】算法期末考试题库1(带解析)【选择题53道&填空题36道&算法填空题7道&a…...
2025.1.8(c++对c语言的扩充——堆区空间,引用,函数)
笔记 上一笔记接续(练习2的答案) 练习:要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试 要求使用new和d…...
如何将Yum源修改为本地挂载的ISO镜像
要将yum源修改为本地挂载的ISO镜像,您可以按照以下步骤进行操作。假设您使用的是CentOS或类似的基于Red Hat的Linux发行版,且已经将ISO镜像文件挂载到系统中。 步骤一:挂载ISO镜像 创建一个挂载点: 首先,您需要创建一个目录来作为ISO镜像的挂载点。例如: sudo mkdir /mnt…...
salesforce如何在系统里保存密码
在 Salesforce 中,保存密码或类似敏感信息时,不应以明文形式存储,而应采用安全的加密和存储机制。以下是一些最佳实践和实现方法: 1. 使用 Salesforce 提供的加密机制 Salesforce 提供了一些内置的加密工具,可以用来加…...
函数提升+上下文+内存清理及释放
文章目录 函数提升上下文函数释放拓展-垃圾回收机制垃圾回收之触发应用 函数提升上下文 函数提升(Hoisting) 概念:在JavaScript中,函数声明会被提升到当前作用域的顶部。这意味着可以在函数声明之前调用函数。例如: sa…...
计算机网络之---计算机网络的性能评估
计算机网络的性能评估是指通过各种标准和指标来衡量网络的工作效率和质量,进而对网络进行优化和改进的过程。评估的目标是确保网络能够满足预期的服务质量(QoS)和性能需求。常见的计算机网络性能评估指标包括带宽、延迟、吞吐量、丢包率等。 …...
Unity学习之UGUI进阶
一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 (1)常用事件接口 (2)不常用事件接口 3、使用事件监听接口 &#…...
深度学习领域创新黑马!频域特征融合新突破
最近,FreqFusion引起了广泛关注,这是一种创新的频率感知特征融合方法,可以提升数据处理的准确性和效率,尤其在语义分割、目标检测、实例分割和全景分割等任务中表现卓越。 通过结合频域分析与特征融合技术,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(Model Context Protocol)协议基础开始,深入探讨Tavily Search MCP服务器的安装配置、使用方法,以及进阶的二次开发技巧。无论你是AI开发者还…...
HTML+CSS+JS制作中华传统美食主题网站(内附源码,含5个页面)
一、作品介绍 HTMLCSSJS制作一个中华传统文化主题网站,包含首页、菜系页、食材页、名厨页、美食故事页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅导航区 包含网站Logo、搜索栏、主导航菜单࿰…...
黄仁勋CES 2025演讲重点内容
黄仁勋CES 2025演讲重点内容 硬件产品发布 GeForce RTX 50系列GPU: 架构与性能提升:正式发布的新一代GeForce RTX 50系列GPU采用英伟达旗舰的Blackwell架构,这是自25年前引入可编程着色技术以来计算机图形领域最重大的创新。该系列显卡在图形…...
TVbox 手机、智能电视节目一网打尽
文章目录 一、简要介绍二、优点三、下载地址 一、简要介绍 TVbox是目前最火爆的多端、多源的电视影音工具,是一款开源的自定义添加站源的影音工具。TVBox,支持电视频道直播。一款TV端影视工具,软件本身不具有任何影视资源,但可以…...
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,下载地址是 GitHub - kubesphere/console at v3.3.2 然后直接用git下拉就可以了 下拉完成后差不多是这样一个目录结构,记得切分支到3.3.2 二、下载依赖 1、node & yurn 想要运行源码首先需要node,使用刚才…...
HWA_03 leetcode874模拟行走机器人
题目map方法的作用解题思路 class Solution:def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:#初始化结果result 0#从原点0,0位置开始出发x0y0#机器人前进的方向#初始方向:正北#0表示向北#1表示向东#2表示向南#3表示向西direction0…...
手把手教你用FPGA(EP4CE6)驱动M25P16 Flash:从SPI时序图到Verilog状态机的保姆级实战
FPGA实战:EP4CE6驱动M25P16 Flash的SPI状态机设计全解析 当我在实验室第一次成功通过FPGA读取到Flash芯片中的数据时,那种成就感至今难忘。对于初学者来说,理解如何将芯片手册中的时序图转化为可运行的Verilog代码,就像学习一门新…...
实战Electron跨进程通信实现SerialPort串口数据交互
1. 为什么Electron 9.0需要跨进程通信处理串口? 第一次用Electron对接工业秤重设备时,我直接把SerialPort代码写在渲染进程,结果控制台突然报错——就像被泼了盆冷水。原来从Electron 9.0开始,安全策略禁止渲染进程直接调用原生No…...
前端设计融合:忍者像素绘卷:天界画坊生成UI/UX素材实战
前端设计融合:忍者像素绘卷:天界画坊生成UI/UX素材实战 1. 像素艺术在前端设计中的独特价值 像素艺术作为一种复古又现代的设计风格,近年来在前端设计领域重新焕发生机。不同于传统设计工具需要手动绘制每个像素点,忍者像素绘卷…...
GLM-4V-9B惊艳效果展示:电路板图元器件识别+故障点定位+维修指引生成
GLM-4V-9B惊艳效果展示:电路板图元器件识别故障点定位维修指引生成 安全声明:本文仅展示AI技术能力,所有电路板图像均为演示用途,不涉及任何实际设备或敏感信息 1. 项目概述与核心能力 GLM-4V-9B多模态大模型在工业视觉检测领域展…...
Cesium实战:手把手教你用四元数搞定飞行模型朝向,告别极点旋转Bug
Cesium实战:四元数驱动飞行模型朝向的终极解决方案 想象一下,你正在开发一个全球飞行模拟系统,当飞机接近北极点时,模型突然像失控的陀螺一样疯狂旋转——这不是特效,而是许多Cesium开发者遇到的经典痛点。传统欧拉角在…...
嵌入式飞控信号滤波:SMA/EMA/互补滤波与卡尔曼简化实现
1. NexgenFilter 库概述:面向嵌入式飞行控制的轻量级信号处理工具集NexgenFilter 是专为 Nexgen Magpie 无人机飞控系统设计的一套高性能、低开销数字滤波与噪声生成库。它并非通用 DSP 库,而是深度嵌入在实时性严苛、资源受限的 MCU(如 STM3…...
SAP S/4HANA Cloud 公有云企业适配与工博科技行业化实施方案
目录 一、直击转型痛点:为何企业需要SAP S/4HANA Cloud 公有云版? 二、精准画像:SAP S/4HANA Cloud 公有云版适合哪些企业? 1. 跨区域经营,需统一管理的集团型企业 2. 生产计划频繁调整,需实时协同的制…...
SHTC3温湿度传感器Arduino底层驱动库详解
1. 项目概述Deneyap Sıcaklık Nem ler,即 Deneyap 温湿度传感器模块(型号 M01,MPV1.0),是一款面向土耳其教育与创客生态的嵌入式环境感知单元,其核心传感元件为 Sensirion 公司出品的 SHTC3 数字温湿度传…...
华为元老许映童下周敲钟:思格新能开启招股:估值超100亿美元 高瓴是基石
雷递网 雷建平 4月8日思格新能源(上海)股份有限公司(简称:“思格新能”,股票代码:“06656”)今日开启招股,准备2026年4月16日在港交所上市。思格新能计划发售1357.39万股,…...
