30

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

4

10 に答える 10

30

テスト済みで動作中:

int ip  = ... ;
String ipStr = 
  String.format("%d.%d.%d.%d",
         (ip & 0xff),   
         (ip >> 8 & 0xff),             
         (ip >> 16 & 0xff),    
         (ip >> 24 & 0xff));
于 2013-05-20T04:05:02.917 に答える
16

これは機能するはずです:

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

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

于 2009-12-24T10:06:10.743 に答える
4

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

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;
    }
}
于 2013-01-19T19:50:26.307 に答える
3

GoogleのGuavaライブラリを使用している場合は、InetAddresses.fromInteger必要な処理を正確に実行します。APIドキュメントはこちら

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

于 2014-04-03T20:55:22.167 に答える
2
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をbytesに変換できます。

于 2014-08-27T06:32:35.727 に答える
1

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は、ApacheCommonsLangのArrayUtilsを使用しています。

于 2010-01-21T15:34:50.153 に答える
1

Google Guavaの使用:

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

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

于 2014-01-15T11:30:53.283 に答える
0

コメントはフォーマットできないので、@Mr.KevinThomasによるコメントから派生したコードを投稿させてください。

if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
    ipAddress = Integer.reverseBytes(ipAddress);
}
sReturn = String.format(Locale.US, "%d.%d.%d.%d", (ipAddress >> 24 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 8 & 0xff), (ipAddress & 0xff));

Androidでテストされています。

于 2020-09-04T13:13:56.573 に答える
-1

これはうまくいくかもしれません


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

于 2009-12-24T10:10:28.783 に答える
-1
  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);
  }
于 2014-02-27T13:53:54.670 に答える