电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

点分十进制子网掩码与CIDR彼此改换详解

2017-05-10 12:09分类:电子技术 阅读:

 

点分十进制子网掩码与CIDR彼此改换详解
输入一个点分十进制的子网掩码地址, 改换为一个CIDR值, 比方输入255.255.255.0, 则得到24位掩码.

255.255.255.0的二进制体现为:

11111111 11111111 11111111 00000000

#include
#include
#include

#if 0
static 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;
}
#else
static 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位的网络序的子网掩码.

上一篇:华为ma5680t局面具体进程指令

下一篇:光纤以太网卡网络协议及规范

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部