Java: конвертировать int в InetAddress - PullRequest
28 голосов
/ 24 декабря 2009

У меня есть int, который содержит IP-адрес в сетевом порядке байтов, который я хотел бы преобразовать в объект InetAddress. Я вижу, что существует конструктор InetAddress, который принимает byte[], нужно ли сначала преобразовывать int в byte[], или есть другой способ?

Ответы [ 9 ]

25 голосов
/ 20 мая 2013

Проверено и работает:

int ip  = ... ;
String ipStr = 
  String.format("%d.%d.%d.%d",
         (ip & 0xff),   
         (ip >> 8 & 0xff),             
         (ip >> 16 & 0xff),    
         (ip >> 24 & 0xff));
12 голосов
/ 24 декабря 2009

Это должно работать:

int ipAddress = ....
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);

Возможно, вам придется поменять местами порядок байтов, я не могу понять, будет ли массив генерироваться в правильном порядке.

4 голосов
/ 19 января 2013

Я думаю, что этот код проще:

static public byte[] toIPByteArray(int addr){
        return new byte[]{(byte)addr,(byte)(addr>>>8),(byte)(addr>>>16),(byte)(addr>>>24)};
    }

static public InetAddress toInetAddress(int addr){
    try {
        return InetAddress.getByAddress(toIPByteArray(addr));
    } catch (UnknownHostException e) {
        //should never happen
        return null;
    }
}
2 голосов
/ 27 августа 2014
public static byte[] int32toBytes(int hex) {
    byte[] b = new byte[4];
    b[0] = (byte) ((hex & 0xFF000000) >> 24);
    b[1] = (byte) ((hex & 0x00FF0000) >> 16);
    b[2] = (byte) ((hex & 0x0000FF00) >> 8);
    b[3] = (byte) (hex & 0x000000FF);
    return b;

}

вы можете использовать эту функцию для преобразования int в байты;

2 голосов
/ 04 апреля 2014

Если вы используете библиотеки Guava от Google, InetAddresses.fromInteger делает именно то, что вам нужно. Api документы здесь

Если вы предпочитаете написать свою собственную функцию преобразования, вы можете сделать что-то наподобие того, что предлагает @aalmeida, за исключением того, что убедитесь, что байты расположены в правильном порядке (сначала старший байт).

1 голос
/ 15 января 2014

Использование Google Guava:

byte [] bytes = Ints.toByteArray (ipAddress);

InetAddress address = InetAddress.getByAddress (байты);

1 голос
/ 21 января 2010

Недостаточно репутации, чтобы комментировать ответ Скаффмана, поэтому я добавлю его как отдельный ответ.

Решение, которое предлагает skaffman, является правильным, за одним исключением. BigInteger.toByteArray () возвращает байтовый массив, который может иметь бит начального знака.

byte[] bytes = bigInteger.toByteArray();

byte[] inetAddressBytes;

// Should be 4 (IPv4) or 16 (IPv6) bytes long
if (bytes.length == 5 || bytes.length == 17) {
    // Remove byte with most significant bit.
    inetAddressBytes = ArrayUtils.remove(bytes, 0);
} else {
    inetAddressBytes = bytes;
}

InetAddress address = InetAddress.getByAddress(inetAddressBytes);

PS вышеприведенный код использует ArrayUtils из Apache Commons Lang.

0 голосов
/ 27 февраля 2014
  public InetAddress intToInetAddress(Integer value) throws UnknownHostException
  {
    ByteBuffer buffer = ByteBuffer.allocate(32);
    buffer.putInt(value);
    buffer.position(0);
    byte[] bytes = new byte[4];
    buffer.get(bytes);
    return InetAddress.getByAddress(bytes);
  }
0 голосов
/ 24 декабря 2009

Это может сработать, попробуйте


public static String intToIp(int i) {
        return ((i >> 24 ) & 0xFF) + "." +
               ((i >> 16 ) & 0xFF) + "." +
               ((i >>  8 ) & 0xFF) + "." +
               ( i        & 0xFF);
    }

...