概述
ipv4可以直接转换成int 数字进行相减得出有多少个,但是ipv6由128位组成,c中没有这么大类型,只能进行拆分运算。
计算原理:
16位一组,分8组这是ipv6的冒分十六进制表示法ABCD:EF01:2345:6789:ABCD:EF01:2345:6789; 此计算原理,8位一组,分16组,把它看作8位2^16进制数。跟10进制运算一样的,从低位开始做减法,如果某一位上减数比被减数大,去高位借一位。被减数高位减1,低位加2^8。以此类推,做16次,最后拼起来就是了。(受博客名“blkq”大佬指点修改)
实现过程:
#define digtal_bit 16*16 //2^8
int ipv6_func1(int pos, struct in6_addr *endIp) //模拟计算借位操作
{
int j;
int flag = 0;
for (j = pos - 1; j >= 0; j--) {
if (endIp->s6_addr[j] == 0)
continue;
else {
endIp->s6_addr[j] = endIp->s6_addr[j] - 1;
flag = 1;
break;
}
}
if (flag) {
for (j = j+1; j < pos; j++) {
endIp->s6_addr[j] = digtal_bit - 1;
}
}
return flag;
}
static int sum_tow_ipv6(struct in6_addr *startIp1, struct in6_addr *endIp1)
{
long count = 0;
int i = 0;
int n = 0;
int j = 0;
int sum[16] = {0};//存放每8位的计算差值
for(i = 15; i >= 0; i--) {
n = endIp->s6_addr[i] - startIp->s6_addr[i];
if (n < 0 && ipv6_func1(i, endIp)) {
count = endIp->s6_addr[i] + digtal_bit;
n = count - startIp->s6_addr[i];
sum[j] = n;
} else {
sum[j] = n;
}
j = j + 1;
}
count = sum[0] + sum[1]*digtal_bit + sum[2]*digtal_bit*digtal_bit +...+sum[15]*digtalbit^15+ 1;//伪代码,计算之间总数,可能会超出限制,优化可以放到字符串里。
return 0;
}
以上实现有啥问题或者改进,希望不吝赐教!
可以参考这个问题,和大佬交流的过程以及细节:
链接: 统计两个ip之间算法原理
最后
以上就是发嗲电源为你收集整理的统计两个ipv6之间有多个地址(不管掩码,就是单纯的组合)的全部内容,希望文章能够帮你解决统计两个ipv6之间有多个地址(不管掩码,就是单纯的组合)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复