【问题标题】:Human readable DhcpInfo.ipAddress?人类可读的 DhcpInfo.ipAddress?
【发布时间】:2011-09-14 19:02:33
【问题描述】:

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

【问题讨论】:

    标签: android ip dhcp


    【解决方案1】:

    其实可以的。

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

    看图:

    【讨论】:

    • 很棒的图形说明了这一点,谢谢!只是希望,它会包含在 android 文档中。
    【解决方案2】:

    使用此功能 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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      11000000 10101000 00000000 00000001
      

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

      【讨论】:

      • 谢谢,我显然太习惯人类可读的格式了 ;-)
      【解决方案4】:

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

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

      【讨论】:

      • 不幸的是,IP 地址的顺序错误,例如192.168.101.102 将输出为 102.101.168.192。至少使用 WifiInfo.getIPAddress()。请改用 Ace(由 Ace 回答)的字节转换。
      【解决方案5】:

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

      byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
      ArrayUtils.reverse(bytes);
      // then
      InetAddress myaddr = InetAddress.getByAddress(ipAddress);
      String ipString = myaddr.getHostAddress();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 2015-11-16
        • 1970-01-01
        • 2012-10-04
        • 2017-07-09
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多