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