【发布时间】:2011-09-14 19:02:33
【问题描述】:
我想知道如何从 DhcpInfo.ipAddress 获取人类可读的 IP 地址?棘手的是,它是一个整数,显然您不能将 IP 地址存储在整数中。那么,IP 地址是如何编码的,它可以存储在 int 中吗?文档对这个问题没有任何帮助:http://developer.android.com/reference/android/net/DhcpInfo.html#ipAddress 谢谢 :-)
【问题讨论】:
我想知道如何从 DhcpInfo.ipAddress 获取人类可读的 IP 地址?棘手的是,它是一个整数,显然您不能将 IP 地址存储在整数中。那么,IP 地址是如何编码的,它可以存储在 int 中吗?文档对这个问题没有任何帮助:http://developer.android.com/reference/android/net/DhcpInfo.html#ipAddress 谢谢 :-)
【问题讨论】:
其实可以的。
IP 地址作为 int 是:AABBCCDD,以人类可读的形式是 AA.BB.CC.DD,但以十进制为基数。如您所见,您可以使用按位运算或将 int 转换为字节数组轻松提取它们。
看图:
【讨论】:
使用此功能 NetworkUtils.java \frameworks\base\core\java\android\net)
public static InetAddress intToInetAddress(int hostAddress) {
byte[] addressBytes = { (byte)(0xff & hostAddress),
(byte)(0xff & (hostAddress >> 8)),
(byte)(0xff & (hostAddress >> 16)),
(byte)(0xff & (hostAddress >> 24)) };
try {
return InetAddress.getByAddress(addressBytes);
} catch (UnknownHostException e) {
throw new AssertionError();
}
}
【讨论】:
显然您不能将 IP 地址存储为整数
实际上,IP (v4) 地址就是一个 32 位整数(或 128 位,在 IPv6 的情况下)。
您所说的“人类可读”格式是通过将整数的位分成称为“八位组”的 8 组并转换为以 10 为底的格式产生的,例如“192.168.0.1”。
此地址的位如下(为便于阅读添加空格):
11000000 10101000 00000000 00000001
对应十进制整数3,232,235,521。
【讨论】:
正如其他发帖者所说,一个 ip 地址是 4 个字节,可以打包成一个 int。安德烈给出了一个很好的例子来说明如何。如果将其存储在 InetAddress 对象中,则可以使用 ToString() 来获取人类可读的版本。比如:
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
String s = address.ToString();
【讨论】:
只需反转您收到的以字节为单位的 ipaddress
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
ArrayUtils.reverse(bytes);
// then
InetAddress myaddr = InetAddress.getByAddress(ipAddress);
String ipString = myaddr.getHostAddress();
【讨论】: