我是靠谱客的博主 发嗲电源,最近开发中收集的这篇文章主要介绍统计两个ipv6之间有多个地址(不管掩码,就是单纯的组合),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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之间有多个地址(不管掩码,就是单纯的组合)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部