2016-04-25 7 views
2

IPv4 может иметь больше представлений: в виде строки (a.b.c.d) или числовой (как неподписанный int из 32 бит). (Возможно, другие, но я их проигнорирую.)Преобразование IP между IPv4 и числовым форматом в java

Есть ли встроенная поддержка в Java (8), простая и простая в использовании, без доступа к сети, для преобразования между этими форматами?

мне нужно что-то вроде этого:

long ip = toNumerical("1.2.3.4"); // returns 0x0000000001020304L 
String ipv4 = toIPv4(0x0000000001020304L); // returns "1.2.3.4" 

Если нет встроенного в таких функций в Java, не стесняйтесь предложить другие решения.

Спасибо

+0

Смотрите этот же вопрос: http://stackoverflow.com/questions/12057853/how-to-convert-string-ip-numbers-to-integer-in-java/12057944#12057944 – gparis

ответ

3

можно сделать с помощью InetAddress следующим образом.

//Converts a String that represents an IP to an int. 
    InetAddress i= InetAddress.getByName(IPString); 
    int intRepresentation= ByteBuffer.wrap(i.getAddress()).getInt(); 

    //This convert an int representation of ip back to String 
    i= InetAddress.getByName(String.valueOf(intRepresentation)); 
    String ip= i.getHostAddress(); 
+0

Будет 'InetAddresss 'делать все локально, без какого-либо предварительного доступа к сети? Являются ли эти преобразования арифметическими только? :) – Costin

+0

Да Класс Inetaddress просто представляет собой адрес интернет-протокола, поэтому нет необходимости в доступе к сети и что именно вы подразумеваете под арифметикой? но, я так считаю, основные операции здесь основаны на смещении бит и т. д. – QuakeCore

+0

Вместо арифметики я должен был сказать «различная интерпретация одних и тех же байтов». Мы можем читать их как числовые или как String (a.b.c.d) Спасибо – Costin

1

Фрагмент кода обеспечивается QuakeCore выбросит «java.net.UnknownHostException: Не удается решить множество» на той части, где вы хотите, чтобы преобразовать его обратно в строку

но идея использования класса InetAddress является верный. Вот то, что вы хотите сделать:

  try { 
       InetAddress inetAddressOrigin = InetAddress.getByName("78.83.228.120"); 
       int intRepresentation = ByteBuffer.wrap(inetAddressOrigin.getAddress()).getInt(); //1314120824 

       ByteBuffer buffer = ByteBuffer.allocate(4); 
       buffer.putInt(intRepresentation); 
       byte[] b = buffer.array(); 

       InetAddress inetAddressRestored = InetAddress.getByAddress(b); 
       String ip = inetAddressRestored.getHostAddress();//78.83.228.120 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); // 
      } 

PS: Если вы будете делать это в течение некоторого списка изобр, проверить их, чтобы убедиться, что они не имеют маски подсети, например: 78.83.228.0/8 В этом случае вы нужно будет выравниваться их: 78.83.228.0/8 => 78.83.228.0 78.83.228.1 78.83.228.2 78.83.228.3 78.83.228.4 78.83.228.5 78.83.228.6 78.83.228.7

1

Heres способ Convert IP to Number. Я нашел его действительным способом для выполнения задачи в Java.

public long ipToLong(String ipAddress) { 

    String[] ipAddressInArray = ipAddress.split("\\."); 

    long result = 0; 
    for (int i = 0; i < ipAddressInArray.length; i++) { 

     int power = 3 - i; 
     int ip = Integer.parseInt(ipAddressInArray[i]); 
     result += ip * Math.pow(256, power); 

    } 

    return result; 
    } 

Это также, как вы бы реализовать его в Scala.

def convertIPToLong(ipAddress: String): Long = { 

    val ipAddressInArray = ipAddress.split("\\.") 
    var result = 0L 

    for (i <- 0 to ipAddressInArray.length-1) { 
     val power = 3 - i 
     val ip = ipAddressInArray(i).toInt 
     val longIP = (ip * Math.pow(256, power)).toLong 
     result = result +longIP 
    } 
    result 
    }