IP(Internet Protocol),IP地址中文名称为互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

  常用的IP地址有IPV4和IPV6,IPV4地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。 IPV6是128位长度,由于IPV4地址长度限制了IP数量,进而发展到IPV6。对于IPV4而言,在使用到网络配置参数时,一般输入格式是以字符型“xxx.xxx.xxx.xxx”格式输入,而保存时则转换为4个8位(unsigned char)整型数或者1个32位(unsigned int)整型数,以节约存储空间,对于使用EEPROM等小容量介质存储有优势。当然也可以以字符型保存,开辟12或者15个字节的存储空间。因此,需用到IP地址与整型数互转的函数,存储时将字符型的IP地址转换为整型;使用时,从存储位置读取的整型IP地址再转换为字符型。

1.整型转字符IP地址

void ipvalue_to_ipaddr(unsigned int ip_value,char *ip_addr)
{sprintf(ip_addr,"%d.%d.%d.%d\0",(ip_value>>24)&0x000000ff,(ip_value>>16)&0x000000ff,(ip_value>>8)&0x000000ff,(ip_value&0x000000ff));
}

  字符串操作首要注意点是结束符,对于字符格式化函数“sprintf”,大家对于是否会添加结束符‘\0’,存在很多异议,据网友在不同编译器下测试,结果是不一样的,有的会带结束符,有的则不带。因此,稳妥的做法是,程序员自己加上结束符,适合在不同编译器,避免更换编译器时掉坑里。

2.IP地址转整型数
方式一:

unsigned int ipaddr_to_ipvalue(char *ip_addr)
{unsigned int ip_value;char *p;char buf[4],i=0;p = strtok(ip_addr,".");while((p)&&(i<4)){buf[i] = atoi(p);p = strtok("",".");i++;}ip_value = buf[0]<<24 | buf[1]<<16 | buf[2]<<8 | buf[3];return ip_value;
}

  上述代码调用到的“strtok”函数是非线性安全函数(不可重入),因为strtok原型采用的是静态内存分配,如果多线程访问时会出现数据异常。在Linux平台下,提供了线程安全函数“strtok_r”,Linux较新版本支持“strsep”函数,效率更高。
方式二:
  对于方式一,应用在Windows上位机上可以正确执行,但在MCU端执行时出错,初步判断是“strsep”函数问题。实现该函数的初衷就是应用在嵌入式上,因此,重新实现字符IP地址转整型数函数。

/*** @brief  ipv4地址转整型* @param  ip_addr:字符ip地址,"192.168.1.254";ip_num:返回数字ip* @retval 是否成功,0表示成功,非0出错
*/
uint8_t ipv4addr_to_ipvalue(const char *ipv4_addr,uint32_t *ipv4_num)
{char buff[4]={0};uint8_t i=0,j=0,k=3,ipaddr_len=0;uint32_t temp=0;    ipaddr_len = strlen(ipv4_addr);if((ipaddr_len > 15)|| (ipaddr_len <7)) /*ip地址长度错误*/return 1;*ipv4_num = 0;for(i=0;i<=ipaddr_len;i++) {if(ipv4_addr[i]=='\0'|| ipv4_addr[i]=='.'){       if((j==0)||(j>3))           /*长度超出*/return 1;buff[j] = '\0';             /*结束符*/temp =atoi(buff);if(temp > 255)return 1;               /*超出范围*/*ipv4_num |= temp<<(k*8);if(k==0)break;                  /*强制结束,ip地址点分超出时,只取前面*/k--;j=0;buff[0]='\0';               /*清空缓存*/}else{buff[j]=ipv4_addr[i];j++;}}return 0;
}

  字符IP地址转为整型的优势就是,减少存储IP地址空间,减少索引IP字符串类型消耗的资源量。

字符IP地址和整型数转换相关推荐

  1. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  2. ip地址转换数字函数 iton_PHP中IP地址与整型数字互相转换详解

    IP转换成整型存储是数据库优化一大趋势,不少人目前存储IP时还在使用字符串类型存储,字符串索引比整型索引消耗资源很多,特别是表中数据量大的时候,以及求查询某一个ip段的数据,今天说的ip是指ip4,i ...

  3. 多网段多通道IP地址和通讯端口转换

    产品型号:NET50-4NAT 特色功能:多网段多通道IP地址和通讯端口转换 产品介绍 工业通讯桥接器(NET50-4NAT)支持IP地址跨网段和通讯端口的转换,同时支持多网段.多通道和多通讯端口. ...

  4. 【Linux】socket地址、IP地址、Port端口转换

    文章目录 (一)通用socket地址 (1)struct sockaddr (2)struct sockaddr_storage (二)专用socket地址 (1) UNIX本地域协议族的socket ...

  5. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商

    目录 简要简介net包 什么是外网IP和内网IP? 获取公网ip 获取本地ip 判断是否是公网ip ip地址string转int ip地址int转string 判断ip地址区间 通过淘宝接口根据公网i ...

  6. 【Programming Clip】点分十进制IP和长整型转换

    作者:gnuhpc  出处:http://www.cnblogs.com/gnuhpc/ 1.用途 将一个整型数值和一个IP字符串相互转换. 2.描述语言 C, Java 3.原理 IP地址是一个以点 ...

  7. golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等

    作者: 一蓑烟雨1989 所属专栏: Go从不放弃到实战 本文链接:https://blog.csdn.net/wangshubo1989/article/details/78066344 生命不止, ...

  8. IP地址及数制的转换

    1.IP地址 1.1IP地址的类型 IPV4地址:由32位二进制数组成,用点分十进制表示 IPV6地址:由128位组成,一般用冒号分隔,十六进制表示 例子: 1.2IPV4网络地址类型 公有网络地址: ...

  9. IP地址子网掩码与数值转换

    坚持每天写一篇学习总结博客,积跬步,至千里. 目录 学习目标 一.IP地址 1.1 IP地址的定义及分类 1.1.1 IP地址的格式 1.1.2 IP地址的分类 1.1.3 Internet上的合法I ...

最新文章

  1. Linux服务器负载均衡LB
  2. java 线程池 源码_java线程池源码分析
  3. Android手机WIFI与电脑间共享文件
  4. search-guard 在 Elasticsearch 2.3 上的运用
  5. Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学
  6. 每日一题:leetcode1319.联通网络的操作次数
  7. POJ 3608 旋转卡壳
  8. java 线程池 资源回收_JAVA线程池资源回收的问题
  9. 关于 create-react-app 自定义 eslint文件配置解决方案
  10. Ubuntu 中将Python3 置为默认版本
  11. python房子代码_基于python的链家小区房价爬取——仅需60行代码!
  12. 知新 | koa框架入门到熟练第一章
  13. 数据分析与挖掘建模实战002:数据获取
  14. 票务系统开发_景区票务系统部署到底是SaaS还是本地化呢?
  15. matlab彩色图像变暗
  16. web安全深度剖析知识点总结
  17. wpf demo (gif , multithredading,httpwatch)
  18. 口袋妖怪lets go服务器维护中,口袋妖怪lets go攻略 口袋妖怪lets go新手攻略(中)...
  19. QCLOUD APIGATEWAY HTTP header字段整理
  20. 正睿17+2天集训总结TOT

热门文章

  1. Linux上磁盘坏道检查和规避
  2. 伦茨课堂-蓝牙音箱应该如何选择
  3. 2022年执法资格刑侦执法考试单选题专项训练题及答案
  4. html代码高亮带行号,highlight代码高亮插件的使用(带行号)个人博客必备
  5. ADM Radeon R9 NANO参数
  6. 基于Java3D的网络三维可视化原型系统设计与实现
  7. android opencv hdr,使用OpenCV 4.0映射HDR图像的色调
  8. python中numpy的dtype
  9. 电脑越来越慢怎么办?
  10. STM32 PWM输出之TIM_SetCompare函数的应用