Преобразование диапазона 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; } Но нигде нет объяснения, что за математика тут происходит и как натуральные логарифмы связаны со всей этой темой. Объясните, пожалуйста, что тут происходит?
Данный код используется для преобразования диапазона 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 адресов.
Данный код используется для преобразования диапазона 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 адресов.