Подтвердить что ты не робот

Java: преобразование int в InetAddress

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

int ip  = ... ;
String ipStr = 
  String.format("%d.%d.%d.%d",
         (ip & 0xff),   
         (ip >> 8 & 0xff),             
         (ip >> 16 & 0xff),    
         (ip >> 24 & 0xff));

Ответ 3

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

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;
    }
}

Ответ 4

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

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

Ответ 5

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 в байты;

Ответ 6

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

Решение 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.

Ответ 7

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

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

Адрес InetAddress = InetAddress.getByAddress(байты);

Ответ 8

Это может работать.


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

Ответ 9

  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);
  }