Как преобразовать Hex в IP-адрес в Java? - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблема с преобразованием шестнадцатеричного в IP-адрес.Например, у меня есть две строки «b019e85» и «ac12accf», которые представляют IP «11.1.158.133» и «172.18.172.207».Есть ли удобный способ преобразования такой шестнадцатеричной строки в IP-адрес?Я прочитал несколько ответов, таких как onvert-hexadecimal-string-to-ip-address и java-convert-int-to-inetaddress .Но оба они не работают.Либо выдает исключение «java.net.UnknownHostException: addr имеет недопустимую длину», либо «java.lang.IllegalArgumentException: hexBinary должен быть четной длины: b019e85». Пример кода:

            InetAddress vipAddress = InetAddress.getByAddress(DatatypeConverter.parseHexBinary("b019e85"));

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Я пишу небольшой вспомогательный метод для преобразования hex в ip (только ipv4).Это не делает проверку действительности.

private String getIpByHex(String hex) {
    Long ipLong = Long.parseLong(hex, 16);
    String ipString = String.format("%d.%d.%d.%d", ipLong >> 24, 
        ipLong >> 16 & 0x00000000000000FF, 
        ipLong >> 8 & 0x00000000000000FF, 
        ipLong & 0x00000000000000FF);

    return ipString;
}

1 Ответ

0 голосов
/ 21 ноября 2018

Не красиво, но должно работать.

public class IpTest {
  public static void main(String[] args) throws Exception {
    String hexAddrString1 = "b019e85";
    String hexAddrString2 = "ac12accf";
    System.out.println("ip:" + getIpFromHex(hexAddrString1));
    System.out.println("ip:" + getIpFromHex(hexAddrString2));
    //To get InetAddress
    InetAddress vipAddress1 = InetAddress.getByName(getIpFromHex(hexAddrString1));
    InetAddress vipAddress2 = InetAddress.getByName(getIpFromHex(hexAddrString2));
  }

  public static String getIpFromHex(String hexAddrString) {
    if (hexAddrString.length() % 2 != 0) {
      hexAddrString = "0" + hexAddrString;
    }
    if (hexAddrString.length() != 8) {
      //error..
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hexAddrString.length(); i = i + 2) {
      final String part = hexAddrString.substring(i, i + 2);
      final int ipPart = Integer.parseInt(part, 16);
      if (ipPart < 0 || ipPart > 254) {
        //Error...
      }
      sb.append(ipPart);
      if (i + 2 < hexAddrString.length()) {
        sb.append(".");
      }
    }
    return sb.toString();
  }
}
...