网络编程 网络地址点分十进制和二进制之间的转换

点分十进制->二进制

点分十进制转二进制的函数有inet_addr,inet_aton,inet_network,inet_pton,它们都将输入的点分十进制字符串转为4字节的二进制数,但在识别点分二进制字符串格式上有出入

inet_addr
#include<arpa/inet.h>typedef uint32_t in_addr_t;in_addr_t inet_addr(const char *cp);

inet_addr将cp指向的点分十进制字符串转为网络字节序的二进制整数,并返回
如果输入无效,会返回一个常数INADDR_NONE,通常为32位全为1的值,这样就导致对于255.255.255.255不能处理

inet_addr识别如下格式的点分十进制,各数值可以是十进制,八进制(带0),十六进制(带0x或0X)

a.b.c.d  正常格式
a.b.c    a和b分别代表一个字节的数据,c代表两个字节的数据,如"192.168.257",257十六进制为0x101,因此这个IP地址是192.168.1.1
a.b      a表示一个字节的数据,b代表3个自己的数据,原理同a.b.c
a        a表示四个字节的数据
#include<stdio.h>
#include<arpa/inet.h>void printfIp(in_addr_t *addr)
{int i = 0;if (!addr){return;}for (i = 0; i < 4; i++){printf("%hhu ", ((char *)addr)[i]);}printf("\n");
}int main(void)
{/* 十六进制,八进制,十进制 */char *s1 = "01.0x11.011.1";/* a.b.c形式 */char *s2 = "127.1.0x0101";/* a.b形式 */char *s3 = "128.0x010101";/* a形式 */char *s4 = "0x01010101";/* 错误形式 */char *s5 = "125.1.0x020202";in_addr_t addr = {0};addr = inet_addr(s1);printfIp(&addr);addr = inet_addr(s2);printfIp(&addr);addr = inet_addr(s3);printfIp(&addr);addr = inet_addr(s4);printfIp(&addr);return 0;
}

输出

1 17 9 1
127 1 1 1
128 1 1 1
1 1 1 1
255 255 255 255
inet_network
#include<arpa/inet.h>typedef uint32_t in_addr_t;in_addr_t inet_network(const char *cp);

inet_network将cp指向的点分十进制字符串转为主机字节序的二进制值并返回,同inet_addr,如果输入无效,返回返回-1,导致不能处理255.255.255.255

inet_work也识别十进制,八进制,十六进制,对于不足四个数的,在前面添0处理,即

a.b.c.d  正常
a.b.c    相当于0.a.b.c
a.b      相当于0.0.a.b
a        相当于0.0.0.a
#include<stdio.h>
#include<arpa/inet.h>void printfIp(in_addr_t *addr)
{int i = 0;if (!addr){return;}for (i = 0; i < 4; i++){printf("%hhu ", ((char *)addr)[i]);}printf("\n");
}int main(void)
{char *s1 = "1.2.3";char *s2 = "1.2";char *s3 = "1";char *s4 = "011";char *s5 = "1.2.3.0x12";char *s6 = "0x12";in_addr_t addr = {0};addr = inet_network(s1);printfIp(&addr);addr = inet_network(s2);printfIp(&addr);addr = inet_network(s3);printfIp(&addr);addr = inet_network(s4);printfIp(&addr);addr = inet_network(s5);printfIp(&addr);addr = inet_network(s6);printfIp(&addr);return 0;
}

输出

3 2 1 0
2 1 0 0
1 0 0 0
9 0 0 0
18 3 2 1
18 0 0 0
inet_aton
#include <arpa/inet.h>typedef uint32_t in_addr_t;struct in_addr
{in_addr_t s_addr;
};int inet_aton(const char *cp, struct in_addr *inp);

inet_aton将cp指向的点分十进制字符串转为网络字节序,保存在inp指向的结构中,如果转换成功,返回1,失败返回0
inet_aton克服了inet_addr不能处理255.255.255.255的缺点

inet_aton也识别八进制,十进制,十六机制,对于少于三个数字,测试发现规律如下,但不知道有什么用

a.b.c.d  正常
a.b.c    相当于a.b.0.c
a.b      相当于a.0.0.b
a        相当于0.0.0.a

另外,如果inp为空,它仍会进行有效性检查,并返回成功与否,但不会保存

#include<stdio.h>
#include<arpa/inet.h>void printfIp(struct in_addr *addr)
{int i = 0;if (!addr){return;}for (i = 0; i < 4; i++){printf("%hhu ", ((char *)addr)[i]);}printf("\n");
}int main(void)
{char *s1 = "4.2.3";char *s2 = "1.2";char *s3 = "1";char *s4 = "011";char *s5 = "1.2.3.0x12";char *s6 = "0x12";char *s7 = "256.1.1.1";char *s8 = "255.1.1.1";struct in_addr addr = {0};if (inet_aton(s1, &addr)){printfIp(&addr);}if (inet_aton(s2, &addr)){printfIp(&addr);}if (inet_aton(s3, &addr)){printfIp(&addr);}if (inet_aton(s4, &addr)){printfIp(&addr);}if (inet_aton(s5, &addr)){printfIp(&addr);}if (inet_aton(s6, &addr)){printfIp(&addr);}if (0 == inet_aton(s7, NULL)){printf("true\n");}if (1 == inet_aton(s8, NULL)){printf("false\n");}return 0;
}

输出

4 2 0 3
1 0 0 2
0 0 0 1
0 0 0 9
1 2 3 18
0 0 0 18
true
false
inet_pton
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

af指定地址族,如IPv4使用AF_INET,src指向点分十进制字符串,dst指向保存结果的32位地址空间,不能为NULL
inet_pton只识别xxx.xxx.xxx.xxx格式的点分十进制,必须是3个点4个数,只能是十进制
inet_pton将src指向的点分十进制字符串转为网络字节序保存在dst指向空间中,如果成功,返回1,失败返回0,如果地址族不支持,返回-1

#include<stdio.h>
#include<arpa/inet.h>void printfIp(struct in_addr *addr)
{int i = 0;if (!addr){return;}for (i = 0; i < 4; i++){printf("%hhu ", ((char *)addr)[i]);}printf("\n");
}int main(void)
{struct in_addr addr = {0};char *s8 = "255.1.1.1";if (inet_pton(AF_INET, s8, &addr)){printfIp(&addr);}}

输出

255 1 1 1

二进制->点分十进制

inet_aton
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);

inet_ntoa认为in是网络字节序,并转为点分十进制字符串返回,字符串存储在静态空间,所有函数共用,有被覆盖风险

#include<stdio.h>
#include<arpa/inet.h>int main(void)
{struct in_addr addr = {0};char *s1 = NULL;addr.s_addr = 0x0102037f;s1 = inet_ntoa(addr);printf("%s\n", s1);return 0;
}

输出

127.3.2.1
inet_ntop
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

af指定协议族,如IPv4使用AF_INET
src指向保存二进制IP地址的空间
dst指向保存字符串结果的空间
size指明dst指向的空间大小

inet_ntop将src处保存的网络字节序的二进制IP地址,转为点分十进制字符串保存在dst中,成功则返回dst,失败返回NULL

#include<stdio.h>
#include<arpa/inet.h>int main(void)
{struct in_addr addr = {0};char s1[16] = {0};char *s2 = NULL;addr.s_addr = 0x0102037f;s2 = inet_ntop(AF_INET, &addr, s1, 16);printf("%s\n", s2);return 0;
}

输出

127.3.2.1

inet_pton的dst由用户自己提供,解决了inet_ntoa结果覆盖的问题

网络编程 网络地址点分十进制和二进制之间的转换相关推荐

  1. C++编程积累——C++实现十进制与二进制之间的互相转换

    欢迎关注原创公众号 [计算机视觉联盟],回复 [西瓜书手推笔记] 可获取我的机器学习纯手推笔记! 直达笔记地址:机器学习手推笔记(GitHub地址) 目录 十进制与二进制之间的转换 十进制转换二进制 ...

  2. java实现十进制与二进制之间的转换

    十进制转二进制 int num = 100;String str = Integer.toBinaryString(num);System.err.println("二进制===" ...

  3. 十进制与二进制之间的转换

    二进制转十进制 二进制的1001转为十进制:为  9. 十进制转二进制: 十进制的8转为二进制:为  1000 转载于:https://www.cnblogs.com/cuixiaomeng/p/67 ...

  4. C++编程积累——C++实现十进制与十六进制之间的互相转换

    欢迎关注原创公众号 [计算机视觉联盟],回复 [西瓜书手推笔记] 可获取我的机器学习纯手推笔记! 直达笔记地址:机器学习手推笔记(GitHub地址) 其他转换请参考博文: C++编程积累--C++实现 ...

  5. C++编程积累——C++实现十进制与八进制之间的互相转换

    其他转换请参考博文: C++编程积累--C++实现十进制与二进制之间的互相转换 目录 十进制与八进制之间的转换 十进制转换八进制 C++实现十进制转换二进制 八进制转换十进制 C++实现八进制转换十进 ...

  6. 二进制,八进制,十进制,十二进制之间的转换!!!!!!!!!

    一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分   ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上 ...

  7. 计算机网络ip进制转换方法,IP地址与二进制之间的转换

    IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...

  8. IP地址与二进制之间的转换

    IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...

  9. IPv4/IPv6地址范围与网络地址/子网掩码的转换,点分十进制与数字掩码的转换

    private static final int IPV4BYTES = 4; // IPv4字节数为4 private static final int BYTEBITS = 8; // 每个字节的 ...

最新文章

  1. python学习--服务期间通讯和mysql数据库操作
  2. 手表后盖怎么装回去_链条掉了怎么装回去
  3. CactiEZ安装配置教程
  4. 最短路径:Dijkstra、BellmanFord以及SPFA算法
  5. Swift vs. Objective-C:未来看好Swift的十个理由
  6. 【哲学】社会主义与资本主义的区别
  7. php 毛玻璃,CSS3实现毛玻璃(图片模糊)效果
  8. MySQL服务MySQL+MHA高可用服务集群搭建
  9. 惠普台式计算机系统系统修复,惠普电脑系统如何恢复【方法步骤】
  10. 高通音频驱动调试(十七)
  11. Raspberry install wine
  12. SAP BTP 简介以及演化历史
  13. 大佬们用代码写的故事,代码你打算写到几岁?
  14. 在html中制作多彩照片墙,60个照片墙布置方案 记录浪漫时刻
  15. bartlett方差齐性检验_仅有两独立样本的样本量、均值和标准差,在SPSS进行T检验...
  16. xv6操作系统中增加一个系统调用
  17. Hexagon GDB Debugger介绍(53)
  18. ios 下拉菜单Menu
  19. Java实现XML格式化
  20. 【音视频】iOS AVAudioSession梳理

热门文章

  1. 【转】Python之optparse模块OptionParser的使用方法
  2. 【TensorflowTTS 中文语音生成 Win10】
  3. 安卓开发-Android Studio界面介绍
  4. flash cs4安装闪一下红的界面
  5. 安大计算机学院李炜教授,自动化系年度人物候选 | 李炜
  6. python实现图像添加噪声、噪声处理、滤波器代码实现
  7. 拼多多风波不断,上市是危机还是契机?_创成汇
  8. vsto clickonce 发布setup.exe失败
  9. 修改EBS R12界面LOGO
  10. 配置Android sdk环境变量不生效