测试按位IPv6网络掩码是否连续的有效方法

我需要在in_addr / in6_addr结构中存储IP地址/网络掩码.

对于IPv4,我使用以下代码来测试网络掩码是否是连续的:

((((~netmask + 1) & (~netmask)) != 0)  && (netmask != 0))

我想知道是否有一种聪明的方法可以为IPv6做同样的事情.

最佳答案 我遇到了以下解决方案:

将IPV6字节拆分为四个32位的块,并按以下方式创建三个部分:

uint64_t netmask1, netmask2, netmask3;
netmask1 = (netmask.s6_addr32[0] << 32) + in6_netmask.s6_addr32[1];
netmask2 = (netmask.s6_addr32[1] << 32) + in6_netmask.s6_addr32[2];
netmask3 = (netmask.s6_addr32[2] << 32) + in6_netmask.s6_addr32[3];

如果其中一个部分不连续,则网络掩码不是连续的.

 if ((((~address1 + 1) & (~address1)) != 0) ||
    (((~address2 + 1) & (~address2)) != 0) ||
    ((~address3 + 1) & (~address3)) != 0))) {
  // Netmask is not valid!
}
点赞