2

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

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

将转换为 64

谢谢

需要将其从 sockaddr_in6 更改为 int

4

2 回答 2

3

我的方法与 Zan 的方法有关,但可以解决struct in6_addr包含在 a 中的 astruct 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,真的:你真的应该接受有效的答案!有一天,人们会完全拒绝帮助你。

于 2012-05-25T08:22:37.650 回答
3

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

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

可能有一些非常酷的位旋转方法可以非常快速地完成此操作。您必须自己查找。

于 2012-05-25T04:04:14.453 回答