数学:计算范围内的总IP

Math: Calculate total IPS in range

本文关键字:IP 范围内 计算 数学      更新时间:2023-10-16

我正在寻找一种计算范围内IP总数的方法。例如:在1.1.1.1和5.5.5.5之间,共有65022 IP。现在我有此代码:

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

它仅适用于低至C类的范围。对于A和B类,它给出了错误的结果。我认为是因为数字太大,并且(int)无法持有它。任何人都有正确的算法来计算?

是的,基于我所看到的,如果C类(最多2^31组合)尽可能地走,这是一个很好的猜测,签名的INT是您的问题(假设您的机器上的INT是32位)

但是,切换到使用未签名的INT应该足够处理。但是,显然不同的类具有需要应用的掩码(http://www.vlsm-calc.net/ipclasses.php),因此如果应该考虑到这一点,则IDK。

同样,由于所有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