将表示前缀掩码的ipv6地址转换为C中的整数格式

时间:2012-05-24 21:46:40

标签: c ipv6 mask

将表示前缀掩码的IPv6地址转换为整数的C代码是什么。

例如,这个IPv6地址前缀掩码: FFFF:FFFF:FFFF:FFFF:0000:0000:0000:0000

将被转换为 64

由于

需要将其从sockaddr_in6更改为int

2 个答案:

答案 0 :(得分:3)

找到位数的最佳方法是永远不要忘记它们。由于IPv6要求通过地址/位方法指定位掩码,因此请记录位并保留它。

如果你不这样做,那么这是一个有点数的问题。由于这些位必须全部在开头,我会尝试通过一次检查字大小位来接近它。字大小可能是32或64.当它不再等于-1UL时,则检查半字大小,四分之一字大小和1字节。对最后一个字节使用256项查找表。

可能会有一些非常酷的bit twiddling方法来快速完成这项工作。你必须自己看一下。

答案 1 :(得分:3)

我的方法与Zan有关,但是应对struct in6_addr中包含的struct sockaddr_in6基本上是16个字符的数组。

因此,您应该迭代字节,直到找到值!= 0xFF

int bits = 0;
struct in6_addr * addr = &((struct sockaddr_in6 *)ai_addr)->sin6_addr;
for (i=0; i<16; i++) {
    if (addr->s6_addr[i] == '\xFF') {
        bits += 8;
    } else {
        case (addr->s6_addr[i]) {
            '\xFE': bits += 7; break;
            '\xFC': bits += 6; break;
            '\xF8': bits += 5; break;
            '\xF0': bits += 4; break;
            '\xE0': bits += 3; break;
            '\xC0': bits += 2; break;
            '\x80': bits += 1; break;
            '\x00': bits += 0; break;
            default: complain();
        }
        break;
    }
}

但是,正如Zan写道的那样,如果你需要的话,最好保留你已经拥有的数字,而不是其他方式。

但是,@ SamuelChampagne,真的:你应该真的接受工作答案!有一天,人们会拒绝帮助你。