我想知道如何从DhcpInfo.ipAddress获取人类可读的IP地址?关于它的棘手的事情是,它是一个整数,显然你不能存储整数的IP地址。那么,IP地址如何编码,它可以存储在一个int中?该文档没有对此问题提供任何帮助:http://developer.android.com/reference/android/net/DhcpInfo.html#ipAddress谢谢: - )
答案 0 :(得分:8)
你实际上可以。
int的IP地址是:AABBCCDD
,以人类可读的形式,它是AA.BB.CC.DD
,但是以十进制为基础。如您所见,您可以使用按位运算或将int转换为字节数组轻松地提取它们。
见图:
答案 1 :(得分:8)
使用此功能 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();
}
}
答案 2 :(得分:5)
显然你不能将IP地址存储在整数
中
实际上,所有的IP(v4)地址都是 - 一个32位整数(或者在IPv6的情况下是128位)。
您所谈论的“人类可读”格式是通过将整数的比特分成称为“八位字节”的8个组并转换为基数10来生成的。 “192.168.0.1
”。
该地址的位如下(为了便于阅读而添加了空格):
11000000 10101000 00000000 00000001
对应于十进制整数3,232,235,521。
答案 3 :(得分:5)
正如其他海报所提到的,ip地址是4个字节,可以打包到一个int中。安德烈给出了一个很好的插图展示了如果将它存储在InetAddress对象中,则可以使用ToString()来获取人类可读的版本。类似的东西:
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
String s = address.ToString();
答案 4 :(得分:0)
只需反转以字节为单位收到的ipaddress
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
ArrayUtils.reverse(bytes);
// then
InetAddress myaddr = InetAddress.getByAddress(ipAddress);
String ipString = myaddr.getHostAddress();