【问题标题】:Converting ipv6 address representing prefix mask into integer format in C在C中将表示前缀掩码的ipv6地址转换为整数格式
【发布时间】:2012-05-24 21:46:40
【问题描述】:

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

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

将转换为 64

谢谢

需要把这个从 sockaddr_in6 改成 int

【问题讨论】:

  • IPv6 parsing in C 的可能重复项
  • 你在问什么?您是否要求“在 IPV6 地址中设置的位数?因为 FFFF:FFFF:FFFF:FFFF 在任何数字系统中都不是 64,所以它恰好是一个设置了所有 64 位的 64 位数字。所以你想要整数的宽度吗?或者只是设置的位数。或者你想把它转换成一个真正的整数,比如 (2^64)-1。
  • 更像 IPv4 的等价物:255.255.255.0 将是 /24,所以在这里,64 位设置为 1,使 128 位 IPv6 地址成为 /64 位网络掩码。谢谢!
  • 不,不是 C 中 IPV6 解析的副本。这是出于网络目的,您希望使用整数而不是地址格式来表示网络的子网掩码。在 IPv4 中,我们将使用 255.255.255.0 表示 /24 网络或 255.255.255.248 表示 /29 网络
  • 就像 IPv4:使用inet_pton 将字符串打包成一个数字,然后开始计算位。

标签: c ipv6 mask


【解决方案1】:

我的方法与 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,真的:你真的应该接受有效的答案!总有一天,人们会完全拒绝帮助你。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      相关资源
      最近更新 更多