INET_NTOA и INET_ATON в Java? - PullRequest
       2

INET_NTOA и INET_ATON в Java?

6 голосов
/ 03 февраля 2012

Я использую Java (со средой Spring) и хочу конвертировать между числовыми представлениями адресов IPv4 (например, 2130706433) и их текстовыми аналогами (например, 127.0.0.1).Часто методы для этого предоставляются на языках программирования (они обычно называются INET_NTOA и INET_ATON соответственно), но я не могу найти его в Java.

Кто-нибудь знает, как они называются или как их реализовать?

Ответы [ 6 ]

4 голосов
/ 03 февраля 2012

Посмотрите на InetAddress в javadocs.Эти функции напрямую не поддерживаются стандартным API, но вы можете извлечь оба представления с помощью этого класса.Небольшой пример:

    InetAddress address = InetAddress.getLocalHost();
    byte[] byteAddress = address.getAddress();
    System.out.println(Arrays.toString(byteAddress));
    System.out.println(address.getHostAddress());

(Имейте в виду, что байты подписаны.)


Если у вас есть long-s, чем yo, можете использовать ByteBuffer для быстрого и комфортного укрытия.Методы: putLong (), затем array ().

3 голосов
/ 03 февраля 2012

java.net.InetAddress.getByAddress (байт [])

Не совсем так же, как INET_NTOA, но очень похоже на.

Пример с длинным аргументом:

String ntoa(long raw) {
    byte[] b = new byte[] {(byte)(raw >> 24), (byte)(raw >> 16), (byte)(raw >> 8), (byte)raw};
    try {
        return InetAddress.getByAddress(b).getHostAddress();
    } catch (UnknownHostException e) {
        //No way here
        return null;
    }
}
2 голосов
/ 13 декабря 2017

Используя библиотеку Java IPAddress это просто, одна строка кода для каждого направления работает как для IPv4, так и для IPv6.Фактически, вы можете написать код, который работает как для IPv4, так и для IPv6, как в первом примере ниже.Отказ от ответственности: я являюсь менеджером проекта этой библиотеки.

Независимость от IP-версии с использованием byte [] и / или BigInteger:

    IPAddress loopback = new IPAddressString("::1").getAddress();
    System.out.println(loopback.getValue());
    IPAddress backAgain = new IPAddressGenerator().from(loopback.getBytes());
    System.out.println(backAgain);

Использование целых чисел для IPv4:

    IPv4Address loopbackv4 = new IPAddressString("127.0.0.1").getAddress().toIPv4();
    System.out.println(loopbackv4.intValue());
    IPv4Address backAgainv4 = new IPv4Address(loopbackv4.intValue());
    System.out.println(backAgainv4);

Использовать BigInteger для IPv6:

    IPv6Address loopbackv6 = new IPAddressString("::1").getAddress().toIPv6();
    System.out.println(loopbackv6.getValue());
    IPv6Address backAgainv6 = new IPv6Address(loopbackv6.getValue());
    System.out.println(backAgainv6);

Вывод:

    1
    0:0:0:0:0:0:0:1

    2130706433
    127.0.0.1

    1
    0:0:0:0:0:0:0:1
2 голосов
/ 10 февраля 2012

Вот что я написал сам, чтобы получить числовое представление текстового адреса IPv4:

public static Long ipAsNumeric(String ipAsString) {
    String[] segments = ipAsString.split("\\.");
    return (long) (Long.parseLong(segments[0]) * 16777216L
       + Long.parseLong(segments[1]) * 65536L
       + Long.parseLong(segments[2]) * 256L + 
         Long.parseLong(segments[3]));
}

Конечно, это предполагает, что адрес IPv4 указан в допустимом формате.

2 голосов
/ 03 февраля 2012

Я думаю, InetAddress будет делать то, что вы хотите

0 голосов
/ 27 декабря 2014

InetAddresses Гуавы сделают свое дело.

Посмотрите на комментарий Идо в Переход от 127.0.0.1 к 2130706433 и обратно

...