Задать вопрос
@javedimka
Хочу сока

Преобразование диапазона IP адресов в CIDR?

В интернете есть множество примеров кода который позволяет сделать необходимые преобразования, например, по линку есть примеры на 5 разных ЯП, приведу сюда пример на Java
Java
public static List<String> iprange2cidr( int ipStart, int ipEnd ) {
    long start = ipStart;
    long end = ipEnd;
 
    ArrayList<String> result = new ArrayList<String>();
    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 < maxDiff) {
            maxSize = maxDiff;
        }
        String ip = long2ip(start);
        result.add( ip + "/" + maxSize);
        start += Math.pow( 2, (32 - maxSize) );
    }
    return result;
}
 
private static long iMask(int s) {
    return Math.round(Math.pow(2, 32) - Math.pow(2, (32 - s)));
}
 
private static long ip2long(String ipstring) {
    String[] ipAddressInArray = ipstring.split("\\.");
    long num = 0;
    long ip = 0;
    for (int x = 3; x >= 0; x--) {
        ip = Long.parseLong(ipAddressInArray[3 - x]);
        num |= ip << (x << 3);
    }
    return num;
}
 
private static String long2ip(long longIP) {
    StringBuffer sbIP = new StringBuffer("");
    sbIP.append(String.valueOf(longIP >>> 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;
}

Но нигде нет объяснения, что за математика тут происходит и как натуральные логарифмы связаны со всей этой темой.
Объясните, пожалуйста, что тут происходит?
  • Вопрос задан
  • 311 просмотров
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы