web-dev-qa-db-ja.com

Java:intをInetAddressに変換します

ネットワークバイトオーダーのIPアドレスを含むintがあります。これをInetAddressオブジェクトに変換します。 byte[]を受け取るInetAddressコンストラクターがあることがわかりました。最初にintbyte[]に変換する必要がありますか、それとも別の方法がありますか?

28
kdt

これはうまくいくはずです:

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

バイト配列の順序を入れ替える必要があるかもしれません。配列が正しい順序で生成されるかどうかわかりません。

12
skaffman

テスト済み、動作中:

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

このコードはもっと簡単だと思います:

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
aalmeida

GoogleのGuavaライブラリを使用している場合は、InetAddresses.fromIntegerはまさにあなたが望むことをします。 APIドキュメントは ここ です

独自の変換関数を作成する場合は、@ aalmeidaが示唆するようなことを行うことができますが、バイトを正しい順序で配置することを忘れないでください(最上位バイトが最初)。

2
aij
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
bowman han

Google Guavaの使用:

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

InetAddressアドレス= InetAddress.getByAddress(bytes);

1
SHUVA JYOTI KAR

Skaffmanの回答についてコメントするには評判が足りないので、これを別の回答として追加します。

Skaffmanが提案するソリューションは、1つの例外を除いて正しいです。 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では、Apache Commons LangのArrayUtilsを使用しています。

1
Dennis Laumen