在Java中检查有效的IPv4地址

我使用sun.net.util.IPAddressUtil包来检查字符串是否包含有效的IPv4和IPv6地址.

代码片段是: –

String ipv4addr="200";

    if(IPAddressUtil.isIPv4LiteralAddress(ipv4addr))
    {
        System.out.println("valid ipv4 address");
    }
    else
    {
        System.out.println("not valid");

    }

但是对于200和300这样的地址,它仍然说它是一个有效的IPv4地址,但事实并非如此.
当我使用相同的包并检查IPV6地址时使用: –

String ipv6addr="200";

    if(IPAddressUtil.isIPv6LiteralAddress(ipv6addr))
    {
        System.out.println("valid ipv6 address");
    }
    else
    {
        System.out.println("not valid");

    }

我得到了正确的结果.但是,IPv4似乎没有工作,或者可能是我错误地使用它.请指导我.我不想使用正则表达式进行IPv4验证…

最佳答案
您获得“有效”结果的原因是:200是有效的IPv4地址.

请参阅计算机,IPv4地址只是一个32位数字.这些点完全是为了我们的方便,因为我们人类很难记住大的精确数字.但他们不必在那里;有关于如何解析地址的规则取决于它具有多少部分.

当地址由一个数字组成时,它被认为是一个32位数字,每个字节是该数字的8位.如果要将“200”解析为IP地址,则相当于0.0.0.200.同样,“2130706433”相当于127.0.0.1.

当地址有两个部分如0.200(第一部分是第一个字节,第二部分是24位数字代表其他3个字节)时,也有标准,甚至0.0.200(前两个数字是字节,最后一部分是16位,占用另外2个字节). “异常”格式是IP地址类时代的遗留物,但几乎所有必须解析地址的软件都会理解它们. (例如,如果您弹出浏览器并转到http:// 1249739112 *甚至http://74.125.33128*,Google的主页将会出现.)

*请参阅可点击链接的评论.谢谢,“链接验证器”. :P

有关更多详细信息,请参见http://download.oracle.com/javase/6/docs/api/java/net/Inet4Address.htmlhttp://www.perlmonks.org/?node_id=221512http://en.wikipedia.org/wiki/IPv4#Address_representations.

Java也理解这些格式(与.net一样,以及任何体面的操作系统),并正确解析地址,无论它包含1,2,3或4个部分.

如果你想检查一个可能的地址实际上看起来像“xxx.xxx.xxx.xxx”,那么你可能想要使用模式或使用考虑32位数字的验证库来显式检查无效地址(即使它们有效).不过我不会打扰 – 如果你使用提供的查找功能,你可以接受任何标准格式的地址,它会起作用.

(所有这些混乱都会随着IPv6的变化而变化;格式更加严格,你不能只输入一些36位数字并期望它能够正常工作.但是平台仍然知道如何解析一个地址,你应该相信它这样做.)

转载注明原文:在Java中检查有效的IPv4地址 - 代码日志