偶然错误使用InetAddress.getByName()

时间:2014-11-07 15:42:48

标签: java android inetaddress

在我的应用程序中,我使用InetAddress.getByName()将字符串如“192.168.1.56”转换为InetAddress对象 - 主要是因为在我看来将IP地址存储为IP地址是一个好主意而不是字符串。直到现在,我会发誓这也是非常万无一失的,但今天我发现了一个错误。这不起作用:

InetAddress ia = InetAddress.getByName ("192.168.1.056");

看起来我的Android认为字符串是一个主机名,所以它试图查找它(这是不可能的,因为它不在“真正的”网络上)。这是我可以解决的问题 - 意思是有没有办法坚持getByName这是一个IP地址,而不是主机名?或者我是否需要构建方法来清除IP地址字符串中的前导零?或者是否有一个安装在某个地方的Apache实用程序可能会更好地解决这个问题?

2 个答案:

答案 0 :(得分:0)

为什么不试试getByAddress (byte[] ipAddress)?这种方法似乎更适合您的需求。

答案 1 :(得分:0)

可能是正则表达式向导可能找到了直接修复IP地址字符串的方法,但我不知道该怎么做。但是,有一种称为Apache SubnetUtils库的东西,它是Android原生的。 SubnetUtils在IP地址字符串上没有牛,其前导零。我的代码如下所示:

public static InetAddress addrFromStr (String addr)
{
    InetAddress ia = null;
    SubnetUtils su = new SubnetUtils (addr + "/8");

    try
    {
        ia = InetAddress.getByName (su.getInfo().getAddress());
    }
    catch (UnknownHostException e)
    { }

    return ia;
}

基本上,我创建了一个SubnetUtils对象,然后询问它的IP地址 - 现在它被剥夺了InetAddress.getByName()显然无法处理的任何数字异常。 (" / 8"业务是CIDR表示法子网掩码,我唯一能说的就是不使用" / 0")。