我有一个int
包含网络字节顺序的 IP 地址,我想将其转换为InetAddress
对象。我看到有一个InetAddress
构造函数需要 a byte[]
,是否有必要将 a 转换int
为byte[]
第一个,还是有其他方法?
问问题
36849 次
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 转换为字节;
于 2014-08-27T06:32:35.727 回答
1
没有足够的声誉来评论 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 上面的代码使用 Apache Commons Lang 的 ArrayUtils。
于 2010-01-21T15:34:50.153 回答
1
使用谷歌番石榴:
byte[] 字节 =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 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 回答
-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 回答