8

我想知道如何从 DhcpInfo.ipAddress 获取人类可读的 IP 地址?棘手的是,它是一个整数,显然您不能将 IP 地址存储在整数中。那么,IP 地址是如何编码的,它可以存储在 int 中吗?该文档对这个问题没有任何帮助:http: //developer.android.com/reference/android/net/DhcpInfo.html#ipAddress谢谢:-)

4

5 回答 5

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();
    }
}
于 2012-06-05T04:40:28.383 回答
8

你实际上可以。

IP 地址 int 是:AABBCCDD以人类可读的形式,AA.BB.CC.DD但以十进制为基数。如您所见,您可以使用按位运算或将 int 转换为字节数组轻松提取它们。

看图片:

在此处输入图像描述

于 2011-06-14T15:02:59.597 回答
5

显然您不能将 IP 地址存储为整数

实际上,这就是一个 IP (v4) 地址——一个 32 位整数(或 128 位,在 IPv6 的情况下)。

您正在谈论的“人类可读”格式是通过将整数的位分成称为“八位字节”的 8 组并转换为以 10 为底的,例如“ 192.168.0.1”来产生的。

该地址的位如下(为便于阅读而添加空格):

11000000 10101000 00000000 00000001

对应十进制整数 3,232,235,521。

于 2011-06-14T15:01:44.617 回答
5

正如其他海报所提到的,一个 IP 地址是 4 个字节,可以打包成一个 int。安德烈给出了一个很好的例子来说明如何。如果将其存储在 InetAddress 对象中,则可以使用 ToString() 来获取人类可读的版本。就像是:

byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
String s = address.ToString();
于 2011-06-14T15:14:42.640 回答
0

只需反转您以字节为单位收到的 ipaddress

byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
ArrayUtils.reverse(bytes);
// then
InetAddress myaddr = InetAddress.getByAddress(ipAddress);
String ipString = myaddr.getHostAddress();
于 2014-11-14T07:39:50.590 回答