数学:计算范围内的总 IPS

Math: Calculate total IPS in range

我正在寻找一种方法来计算某个范围内的 ip 总数。 例如:1.1.1.1 和 5.5.5.5 之间共有 65022 个 ips。 现在我有这个代码:

    int Remain = 
    (IP2[0] - IP1[0]) * 256 +
    (IP2[1] - IP1[1]) * 256 +
    (IP2[2] - IP1[2]) * 256 +
    (IP2[3] - IP1[3]) + 1;

它仅适用于高达 c class 的低范围。对于 a 和 b class 它给出了不正确的结果。我认为是因为 number 太大并且 (int) 无法容纳它。 谁有正确的算法来计算?

是的,根据我所见,如果 class C(最多 2^31 种组合)是您所能达到的极限,那么可以很好地猜测 signed int 是您的问题(当然假设 int 在你的机器上是 32 位)

但是切换到使用无符号整数应该足以处理这个问题。然而,显然不同的 classes 有需要应用的掩码 (http://www.vlsm-calc.net/ipclasses.php),所以如果应该考虑到这一点,我想知道。

此外,由于所有 IPv4 IP 都只是 4 字节数字,我提供了另一种快速而肮脏的方法来计算它,你真的需要使用它,但如果你需要的话,它会使屏蔽更容易实现:

unsigned int calculate_available_ips(int r_start[4], int r_end[4])
{
    unsigned int ip1 = r_start[0] << 24 | r_start[1] << 16 | r_start[2] << 8 | r_start[3];
    unsigned int ip2 = r_end[0] << 24 | r_end[1] << 16 | r_end[2] << 8 | r_end[3];

    if (ip1 > ip2) {
      return ip1 - ip2 + 1;
    }
    return ip2 - ip1 + 1;
}

自然地,只需对 uint 使用位操作即可完成屏蔽。请注意,要打印出无符号值,请使用 %u 而不是 %d