问题

有一个IP地址"127.0.0.1" 需要他的四字节整型值?
反过来有一个整型值,如何转换为一个点分十进制的IP地址?
其实libc是提供这个接口的,不需要自己再造轮子,对比我们自己的实现,用到了联合体,非常值得学习,如下:

1、inet_addr

typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};
/** Ascii internet address interpretation routine.* The value returned is in network order.*/
in_addr_t
__inet_addr(const char *cp) {struct in_addr val;if (__inet_aton(cp, &val))return (val.s_addr);return (INADDR_NONE);
}
weak_alias (__inet_addr, inet_addr)/** Check whether "cp" is a valid ascii representation* of an Internet address and convert to a binary address.* Returns 1 if the address is valid, 0 if not.* This replaces inet_addr, the return value from which* cannot distinguish between failure and a local broadcast address.*/
int
__inet_aton(const char *cp, struct in_addr *addr)
{static const in_addr_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };in_addr_t val;char c;union iaddr {uint8_t bytes[4];uint32_t word;} res;uint8_t *pp = res.bytes;int digit;int saved_errno = errno;__set_errno (0);res.word = 0;c = *cp;for (;;) {/** Collect number up to ``.''.* Values are specified as for C:* 0x=hex, 0=octal, isdigit=decimal.*/if (!isdigit(c))goto ret_0;{char *endp;unsigned long ul = strtoul (cp, (char **) &endp, 0);if (ul == ULONG_MAX && errno == ERANGE)goto ret_0;if (ul > 0xfffffffful)goto ret_0;val = ul;digit = cp != endp;cp = endp;}c = *cp;if (c == '.') {/** Internet format:*  a.b.c.d*    a.b.c   (with c treated as 16 bits)*    a.b (with b treated as 24 bits)*/if (pp > res.bytes + 2 || val > 0xff)goto ret_0;*pp++ = val;c = *++cp;} elsebreak;}/** Check for trailing characters.*/if (c != '\0' && (!isascii(c) || !isspace(c)))goto ret_0;/** Did we get a valid digit?*/if (!digit)goto ret_0;/* Check whether the last part is in its limits depending onthe number of parts in total.  */if (val > max[pp - res.bytes])goto ret_0;if (addr != NULL)addr->s_addr = res.word | htonl (val);__set_errno (saved_errno);return (1);ret_0:__set_errno (saved_errno);return (0);
}
weak_alias (__inet_aton, inet_aton)
libc_hidden_def (__inet_aton)
libc_hidden_weak (inet_aton)

2、inet_ntoa 看源码还是相对比较简单,就是格式化字符串

/* The interface of this function is completely stupid, it requires astatic buffer.  We relax this a bit in that we allow one buffer foreach thread.  */
static __thread char buffer[18];
char *
inet_ntoa (struct in_addr in)
{unsigned char *bytes = (unsigned char *) ∈__snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",bytes[0], bytes[1], bytes[2], bytes[3]);return buffer;
}

3、测试

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>int main()
{unsigned long a = inet_addr("127.0.0.1");printf("a is %d\r\n", a);struct in_addr addr1;addr1.s_addr = a;char *p = inet_ntoa(addr1);printf("p is %s\r\n", p);return 0;
}

4、运行结果


完结,注意inet_addr转换后是一个网络字节序,也就是大端,如果是本地使用还需要注意哈。

IP地址与int32整型之间的转换相关推荐

  1. java长整型转换为整型_java ip地址转换为长整型

    java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...

  2. IP地址与字符串、整型之间的转换

    2019独角兽企业重金招聘Python工程师标准>>> /**      * 整型转IP      * @param ipInt      * @return      */     ...

  3. 关于Python中IPv4地址转换为长整型的操作

    最近一段时间在公司忙活着将最新项目的接口进行自动化,在项目中的某个版块中涉及IP地址.然后就涉及生成随机且正确的IPv4地址,当然这个是非常容易生成的: # 这里将_这个占位符来做一个临时变量,Pyt ...

  4. 网址(url),域名,ip地址,dns,hosts之间的关系

    网址(url),域名,ip地址,dns,hosts之间的关系 什么是ip? 我们知道,在Internet上有千百万台主机,为了区分这些主机,人们给每台主机都分配了一个专门的地址,称为IP地址.通过IP ...

  5. C#语言中提供了枚举和整型之间的强制转换功能(SelectItem)

    [csharp] view plain copy   <span style="font-family: Arial, Helvetica, sans-serif;"> ...

  6. C语言操作符详解 隐式类型转换 (整型提升 算数转换)

    目录 一.算术操作符 二.左移操作符 右移操作符 1.二进制序列 2.左移操作符 3.右移操作符 3.1.逻辑运算/算术运算 3.2.对于移位运算符,不要移动负数位,这是标准未定义的 3.3.对于移位 ...

  7. c#获取本地ip地址网关子网掩码_这样解释IP地址、子网掩码、网关之间的联系,不会技术也能听懂...

    原作者:老王谈运维 今日头条 原文链接:https://www.toutiao.com/a6707495163079426563/ 网络无处不在,深深影响着我们的生活.而下面几点知识是我们在网络学习中 ...

  8. 【C#】ip与无符号整型转换

    IP在数据库中储存,为了减少空间,可以存为无符号的整形,长度刚好够用.变换关系如下 这里使用Linq表达式 //ip转整型,示例结果为771452401 var ip = "45.251.1 ...

  9. PPP协议和MAC地址、IP地址及ARP协议三者之间的关系(3.2)

    目录 点对点PPP协议 PPP协议封装的帧格式 PPP协议工作流程 媒体接入控制 媒体接入控制的分类 怎么解决"碰撞问题"?(随机接入方式) CSMA/CD(多址接入.载波监听.碰 ...

最新文章

  1. 【Matlab】一个超简单的生成顺序数组的方法
  2. 集合数百个常用工具类集合,V2.3.10.104
  3. 【Java进阶】Elasticsearch应用之京东搜索
  4. 技术分享:如何避免ajax重复请求?
  5. POJ - 1087 A Plug for UNIX(最大流)
  6. python中getrandbits函数用法_python random - 刘江的python教程
  7. java初学者指南_Java初学者指南
  8. 移植驱动完毕后加载时的version magic报错原因以及解决办法
  9. 11月 北京 | 高性能之GPU CUDA 3天密集式进阶课程
  10. [APUE]进程控制(中)
  11. 关于类型的存储时间和链接
  12. 渝粤题库 陕西师范大学 《语言学概论》 作业
  13. 淘宝客APP源码导购APP源码代理淘客APP源码
  14. 当上拉加载更多即ion-content遇上slideBox的时候
  15. 阿里云的安全防护措施
  16. 【Netty - 解码器】did not read anything but decoded a message 异常
  17. 北京协和医学院823计算机原理,2017年北京协和医学院病原生物学研究所823计算机原理考研仿真模拟题...
  18. activiti:initiator详解
  19. 如何画 1PX 的线
  20. 阶乘、排列、组合 公式计算

热门文章

  1. 全国青少年编程等级考试scratch二级真题2019年3月(含题库答题软件账号)
  2. 利用opencv拼接图像视频摄像头进行录像
  3. SAP MTS案例教程目录
  4. 暗影精灵8安装ubuntu18.04双系统后wifi适配器(没有wifi图标)缺少
  5. H5新特性:canvas学习1
  6. C语言源码做的职工工资管理系统课程设计(源码+课程设计报告)
  7. [爆笑网文]10年假球白练了!----伤心球迷致中国足球队的一封信
  8. Alcohol 120% 的五种烧录方式各有什么区别
  9. 质量管理体系之设计评审
  10. Linux性能优化大师-系统优化漫谈