int offset=masked/8;
char remmask=0;
int rem = masked%8;
while(rem)
{
rem--;
remmask|= 0x80>>rem; //0x80 is the highest bit in a byte set
}
offset++;
(((char*)ipv6)+offset) &= remmask;
while(offset<16)
{
(((char*)ipv6)+offset=0;
offset++;
}
typedef uint16_t ip6_addr[8];
void ipv6_apply_mask(const char *ip6addr, unsigned int mask, ip6_addr ip6){
ip6_addr in_ip6;
inet_pton(PF_INET6, ip6addr, ip6);
for(int i = 0; i < 8; i++){
in_ip6[i] = ntohs(ip6[i]);
}
int index = (int) (mask / 16);
int residue = mask % 16;
if(residue == 0 && index == 8)
return;
switch(residue){
case 0:in_ip6[index++] = 0; break;
case 1:in_ip6[index++]&=0x8000; break;
case 2:in_ip6[index++]&=0xc000; break;
case 3:in_ip6[index++]&=0xe000; break;
case 4:in_ip6[index++]&=0xf000; break;
case 5:in_ip6[index++]&=0xf800; break;
case 6:in_ip6[index++]&=0xfc00; break;
case 7:in_ip6[index++]&=0xfe00; break;
case 8:in_ip6[index++]&=0xff00; break;
case 9:in_ip6[index++]&=0xff80; break;
case 10:in_ip6[index++]&=0xffc0; break;
case 11:in_ip6[index++]&=0xffe0; break;
case 12:in_ip6[index++]&=0xfff0; break;
case 13:in_ip6[index++]&=0xfff8; break;
case 14:in_ip6[index++]&=0xfffc; break;
case 15:in_ip6[index++]&=0xfffe; break;
}
for (int i = index; i < 8; i++){
in_ip6[i] = 0;
}
for(int i = 0; i < 8; i++){
ip6[i] = htons(in_ip6[i]);
}
return;
}
8条答案
按热度按时间bvjxkvbb1#
好的,我是用C而不是C++做的,但是它应该能用。而且,它使用
bswap_64
,这是一个GNU扩展,所以可能不是对所有东西都能用。在amd64上看起来非常快,而且比Yasar想出的当前解决方案更快:
gpnt7bae2#
根据前缀长度计算掩码:
将网络掩码应用于地址,我从
inet_lnaof
中派生了此代码。zqdjd7g93#
您可以使用inet_pton将地址转换为网络字节顺序的二进制。然后一次设置/清除一个字节。
qyyhg6bp4#
请参见
in6calc.c
中的函数in6_addr_mask
和in6_addr_start
。示例用法:
产量:
z9zf31ra5#
威胁IP,如16字节数组,跳过下一个字节掩码中的
masked/8
字节,较高的masked%8
位,将其他位设置为0
写的代码就在这里,所以它还没有经过测试,但我认为你可以使用这样的东西
vhipe2zx6#
下面是一个简单的计时器:
polkgigr7#
我搜索这个函数,但上面似乎很复杂,所以我写了自己的;
当然,您可以使用自己更喜欢的函数名。
kninwzqo8#
这是快速和肮脏的解决方案,源代码如下,如果你想,使用它。2警告!3该函数假设IPv6地址是有效的。