将表示前缀掩码的IPv6地址转换为整数的C代码是什么?
例如,此 IPv6 地址前缀掩码:FFFF
:FFFF:FFFF:FFFF:0000:0000:0000:0000将转换为64
谢谢
需要将其从 sockaddr_in6 更改为 int
我的方法与 Zan 的方法有关,但要处理这样一个事实,即包含在struct sockaddr_in6
中的 struct in6_addr
本质上是一个包含 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,真的:你真的应该接受有效的答案!总有一天,人们会拒绝帮助你。
找到位数的最好方法是永远不要忘记它们。由于 IPv6 要求由地址/位方法指定位掩码,因此请记录位并保留它。
如果你不这样做,那么这是一个位计数问题。由于位必须在开始时全部,因此我会尝试通过一次检查字大小位来接近它。字数可能是 32 或 64。当它不再等于-1UL
时,请检查半字大小、四分之一字大小和 1 字节。对最后一个字节使用 256 项查找表。
可能有一些非常酷的叽叽喳喳方法可以非常快速地做到这一点。你必须自己查一下。