Преобразование диапазона IP адресов в CIDR? В интернете есть множество примеров кода который позволяет сделать необходимые преобразования, например, по линку есть примеры на 5 разных ЯП, приведу сюда пример на JavaJavapublic static List iprange2cidr( int ipStart, int ipEnd ) {
long start = ipStart;
long end = ipEnd;

ArrayList result = new ArrayList();
while ( end >= start ) {
byte maxSize = 32;
while ( maxSize > 0) {
long mask = iMask( maxSize - 1 );
long maskBase = start & mask;

if ( maskBase != start ) {
break;
}

maxSize--;
}
double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxDiff = (byte)( 32 - Math.floor( x ) );
if ( maxSize = 0; x--) {
ip = Long.parseLong(ipAddressInArray[3 - x]);
num |= ip >> 24));
sbIP.append(".");
sbIP.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));
sbIP.append(".");
sbIP.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));
sbIP.append(".");
sbIP.append(String.valueOf(longIP & 0x000000FF));

return sbIP.toString();
}
Код понятен, почти весь, во всех найденных мной примерах есть куски кода:double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxDiff = (byte)( 32 - Math.floor( x ) );
if ( maxSize < maxDiff) {
maxSize = maxDiff;
}
Но нигде нет объяснения, что за математика тут происходит и как натуральные логарифмы связаны со всей этой темой.
Объясните, пожалуйста, что тут происходит?

21 Авг 2019 в 06:36
199 +1
0
Ответы
1

Данный код используется для преобразования диапазона IP адресов в формат CIDR (Classless Inter-Domain Routing). CIDR представляет из себя запись IP адреса и длины префикса в формате "IP адрес/длина префикса".

Вот краткое объяснение того, что происходит в участке кода, который вы указали:

Переменная x вычисляет количество IP адресов в диапазоне, заданном переменными start и end, при помощи натурального логарифма. Формула Math.log( end - start + 1) / Math.log( 2 ) вычисляет количество бит, необходимых для представления данного диапазона IP адресов.Переменная maxDiff вычисляет максимальную длину префикса CIDR для данного диапазона IP адресов. При помощи выражения 32 - Math.floor( x ) определяется количество бит, которые необходимо для представления данного диапазона IP адресов.Далее, если переменная maxSize меньше чем maxDiff, то значение maxSize присваивается значение переменной maxDiff. Это необходимо для того, чтобы определить минимальное количество бит, которые позволят правильно представить весь диапазон IP адресов.

В итоге, после преобразования диапазона IP адресов в CIDR формат, функция возвращает список CIDR записей, представляющих всевозможные подсети данного диапазона IP адресов.

20 Апр в 13:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир