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

【206】VS2022 C++ 实现无符号32位整数和IP地址字符串互相转换

无符号32位整数和IP地址字符串之间的理论关系,可以参考我的前一篇文章:【205】Python3 实现整数和IP地址字符串互相转换

下面是具体的代码实现,已经在 VS 2022上调试通过。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//0.0.0.0
// 255.255.255.255
// IP字符串转无符号32位整数
bool ipToUint(const char* const inIp, unsigned int* outN) {const int charArrSize = 16;size_t len = strlen(inIp);if (len > 15 || len < 7) {printf("Length of inIp is greater than 15 or less than 7!\n");return false;}int dotNum = 0;for (int i = 0; i < len; i++){char c = inIp[i];if (c == '.') {dotNum++;}}// 字符串的IP地址必须含有三个点if (dotNum != 3) {printf("Ip string must has 3 dot !\n");return false;}char str1[charArrSize] = "";char str2[charArrSize] = "";char str3[charArrSize] = "";char str4[charArrSize] = "";dotNum = 0;for (int i = 0; i < len; i++) {char c = inIp[i];if (c == '.') {dotNum++;}else if (0 == dotNum) {size_t lenSub = strlen(str1);str1[lenSub] = c;str1[lenSub + 1] = '\0';}else if (1 == dotNum) {size_t lenSub = strlen(str2);str2[lenSub] = c;str2[lenSub + 1] = '\0';}else if (2 == dotNum) {size_t lenSub = strlen(str3);str3[lenSub] = c;str3[lenSub + 1] = '\0';}else if (3 == dotNum) {size_t lenSub = strlen(str4);str4[lenSub] = c;str4[lenSub + 1] = '\0';}}if (0 == strlen(str1) || 0 == strlen(str2) || 0 == strlen(str3) || 0 == strlen(str4)) {printf("Failed to split ip string !\n");return false;}unsigned int n1 = atoi(str1) << (8 * 3);unsigned int n2 = atoi(str2) << (8 * 2);unsigned int n3 = atoi(str3) << 8;unsigned int n4 = atoi(str4);unsigned int n = n1 + n2 + n3 + n4;(*outN) = n;return true;
}// 无符号32位整数转IP字符串
bool uintToIp(const unsigned int inNum, char* outIp, int outIpSize)
{if (outIpSize < 16) {printf("outIpSize must be greater then or equal 16!\n");return false;}int ret = -1;int ipInt_4 = inNum & 255;int ipInt_3 = (inNum >> 8) & 255;int ipInt_2 = (inNum >> (8 * 2)) & 255;int ipInt_1 = (inNum >> (8 * 3)) & 255;// sprintf_s 返回值:写入的字符数或 -1(如果发生错误)。 如果 buffer 或 format 是 null 指针,sprintf_s 和 swprintf_s 将返回 -1 并将 errno 设置为 EINVAL。ret = sprintf_s(outIp, outIpSize, "%d.%d.%d.%d", ipInt_1, ipInt_2, ipInt_3, ipInt_4);if (-1 == ret) {printf("uintToIp  sprintf_s error.\n");return false;}return true;
}int main(int argc, char** argv) {char ip1[16] = "0.0.0.0";unsigned int n;ipToUint(ip1, &n);printf("ip=%s,  integer=%u\n", ip1, n);char ip2[16];bool flag = uintToIp(n, ip2, 16);printf("%s     flag=%d\n", ip2, flag);sprintf_s(ip1, "255.89.9.0");n;ipToUint(ip1, &n);printf("ip=%s,  integer=%u\n", ip1, n);flag = uintToIp(n, ip2, 16);printf("%s     flag=%d\n", ip2, flag);return 0;
}
http://www.xdnf.cn/news/464887.html

相关文章:

  • element-ui的el-cascader增加全选按钮实现(附源码)
  • DB-GPT扩展自定义app配置说明
  • 【网络编程】九、详解 HTTPS 加密原理
  • 鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
  • AEO认证的好处 ,如何快速获取AEO认证?
  • Java应用OOM排查:面试通关“三部曲”心法
  • android display 笔记(十四)VAU 和GSP 分别代表什么
  • fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请
  • 企业级Javaweb开发常用注解
  • macOS中5000端口被控制中心占用问题
  • 洛谷P4907题解
  • Milvus(23):过滤
  • 《Python星球日记》 第81天:回看图像生成与风格迁移
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • AcroForm 文档(打开时)级脚本对比 Excel VBA 参考
  • 关于多线程的Redis模型
  • 数据科学和机器学习的“看家兵器”——pandas模块 之二
  • c++从入门到精通(四)--动态内存,模板与泛型编程
  • python克洛伊婚纱摄影预约管理系统
  • P2679 [NOIP 2015 提高组] 子串
  • Linux之Yum源与Nginx服务篇
  • Node.js 安装 + React Flow 快速入门:环境安装与项目搭建
  • Spring Boot 和 Jedis版本搭配的建议
  • 【言语】刷题5
  • win11平台下的docker-desktop中的volume位置问题
  • Newtonsoft.Json.JsonSerializationException
  • 安卓A15系统实现修改锁屏界面默认壁纸功能
  • 多个docker-compose-xx 停止并完全卸载 删除
  • C++:字符数组与字符串指针变量的大小
  • 鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp