点分十进制子网掩码和CIDR的相互转换
来源:互联网 发布:人工智能人才培养 编辑:程序博客网 时间:2024/06/06 04:07
#include <stdio.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc, char **argv){ if (argc != 4) { printf("usage:test <ip.address> <net.address> <mask.address>"); return -1; } struct sockaddr_in ipaddr;/*IP ADDR---argv[1]*/ struct sockaddr_in netaddr;/*NET ADDR*/ struct sockaddr_in maskaddr;/*MASK ADDR ,string=255.255.255.0*/ if (inet_pton(AF_INET,argv[1], &ipaddr.sin_addr) < 1) { printf("inet_pton error:%s\n",argv[1]); return -1; } if (inet_pton(AF_INET,argv[2],&netaddr.sin_addr) < 1) { printf("inet_pton error:%s\n",argv[2]); return -1; } if (inet_pton(AF_INET,argv[3],&maskaddr.sin_addr) < 1) { printf("inet_pton error:%s\n",argv[3]); return -1; } if ((ipaddr.sin_addr.s_addr & maskaddr.sin_addr.s_addr) == netaddr.sin_addr.s_addr) { printf("this ip is in the subnet\n"); return 0; } else { printf("this ip is not in the subnet\n"); return 0; }} #include <stdio.h>#include <stdlib.h>#include <arpa/inet.h> #if 0static int ntod(u_int32_t mask) { //转换函数1 int i, n = 0; int bits = sizeof(u_int32_t) * 8; for(i = bits - 1; i >= 0; i--) { if (mask & (0x01 << i)) n++; } return n;}#elsestatic int ntod(u_int32_t mask) { //转换函数2 float f; mask = -mask; //第一步 f = mask; //第二步 mask = *(unsigned *)&f; //第三步 mask = 159 - (mask >> 23); //第四步 return mask;}#endif static u_int32_t dton(u_int32_t mask) { //转换函数3 u_int32_t i, c; int bits = sizeof(u_int32_t) * 8; i = ~0; bits -= mask; /* 让32位全是1的无符号数与左移bits位(右移位用0填充)得出子网掩码 */ i <<= bits; return htonl(i);} int main(void) { char input[32]; struct in_addr addr; scanf("%s", input); if (inet_aton(input, &addr) == 0) { printf("netmask is wrong\n"); exit(1); } addr.s_addr = htonl(addr.s_addr); printf("%d\n", ntod(addr.s_addr)); return 0;}
在转换函数1中, 使用的是最直接的方法, 通过对0x1左移位, 求出一共有多少个1, 从而得出子网掩码号.
本文的重点在于如果通过转换函数2得出子网掩码的, 这里我们先了解一下C语言对单精度浮点数的存储.
float一共32位, 其结构定义如下:
|-------- 31 -------|------------ 30-23 ------------ |------------ 22-0 ------------|
符号位(sign) 指数部分(exp) 底数(小数)部分(mag)
sign:符号位就一位, 0表示正数, 1表示负数
exp: 指数部分, 无符号正数
mag: 小数部分, 定点小数, 小数点在最左边
浮点数存储在第30位到第23位之间的8位上存储的是指数, 因为8位空间最多只能保存0~255个数, 所以能表示的有2的256次方, 但因为指数是可正可负的, 所以IEEE龟腚这里会有一个127的偏移量,它的127相当于0, 小于127时为负, 大于127时为正, 最高位为符号位. 这里我们是转换的正数, 所以exp=指数+127.
在这里我们先对函数接收的mask求负数(第一步), 也就是取反加1:
11111111 11111111 11111111 00000000
↓
00000000 00000001 00000000 00000000
得到256, 也就是2的8次方. 然后把这个整数转换为单精度浮点数储存(第二步), 因为该数为一个正整数, 所以sign=0, exp=127+8, 没有小数部分所以mag=0.
第三步把用单精度浮点数存储空间的内容又保存为无符号整形数(因为在32位机器上, 同为4个字节, 可以安全转换), 这样做的目的是因为单精度浮点数不能移位操作, 所以又转化为整形.
第四步先把mask右移23位, 因为最高位是0, 所以右移操作会补零, 得到我们的exp的值.这里我们做一个简单的方程, 设我们的子网掩码为x:
exp-127=32-x
exp-159=-x
x=159-exp
就此我们的转换函数2完成.
最后一个转换函数3, 是传入一个小于等于32的数, 转换为32位的网络序的子网掩码.
0 0
- 点分十进制子网掩码和CIDR的相互转换
- 点分十进制转换
- 点分十进制与网络字节序之间的相互转换
- 点分十进制字符串IP与十进制整数相互转换方法
- 点分十进制IP转换
- 十进制和十六进制的相互转换
- 十进制和二进制的相互转换
- 二进制和十进制之间的相互转换
- 十进制和二进制的相互转换
- BCD码和十进制的相互转换
- 二进制和十进制的相互转换
- 子网掩码转换:长度<-->点分10进制
- 【Programming Clip】点分十进制IP和长整型转换
- 点分十进制IP和长整型转换
- 点分十进制IP和长整型转换
- linux网络-点分十进制和网络字节序转换
- Windows 下IP点分十进制和网络字节序的转换
- 网络字节序 主机字节序 点分十进制ip 相互转换
- 设置屏幕颜色
- [SC-07]qt语言翻译家linguist的使用
- UVA - 10004 Bicoloring
- 关于python文件操作
- 使用动画和fragment改善Android表单
- 点分十进制子网掩码和CIDR的相互转换
- java.系统自动生成一个1-100之间的整数,请猜出这个数
- SpringMVC框架搭建
- matlab 声卡 信号源
- 重构之3.Replace Type Code with Subclasses(以子类取代类型码)
- 判断一个IP是否在指定的网络中
- Spring3.x--SpringMVC
- ThoughtWorks开源了Go持续交付平台
- Struts常见问题