2016-12-08 3 views
0

Я ищу способ расчета общего количества ips в диапазоне. Например: между 1.1.1.1 и 5.5.5.5 всего 65022 ips. Прямо сейчас у меня есть этот код:Math: Рассчитать общее количество IPS в диапазоне

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) не может его удерживать. У кого-то есть правильный алгоритм для вычисления?

+0

Помните, что 'int' является * signed * и что целые литералы (например,' 256') имеют тип 'int', если они не имеют суффикса с спецификатором. –

+0

Я действительно думал, что Интернет основан сегодня в бесклассовой междоменной маршрутизации – Amadeus

ответ

1

Да, в зависимости от того, что я вижу, если класс C (до 2^31 комбинаций), насколько вы можете идти, было бы неплохо предположить, что подписанный int является вашей проблемой (предполагая, конечно, int 32 бит на вашей машине)

Однако переключение на использование неподписанных цепей должно в достаточной мере справиться с этим. Однако, по-видимому, разные классы имеют маски, которые необходимо применять (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.

+0

Это работает отлично. Я собираюсь использовать это в своих будущих проектах! – Clarke

+0

должно быть '% u' для печати. меняя теперь, чтобы отразить это спасибо! –

Смежные вопросы