Java 如何测试ipv6地址是否与网络前缀匹配

Java 如何测试ipv6地址是否与网络前缀匹配,java,networking,ipv6,Java,Networking,Ipv6,我必须测试“IPv4映射地址”是否与某些ipv6网络前缀匹配,如2001:db8::/32 我已经阅读并理解了如何测试地址是否位于子网中 我不知道这些链接是否与我的上下文相关。据我所知,我们可以使用“映射”地址的有线格式创建128位IPv6地址,并在IPv6数据包头中传输。但是,Java的InetAddress创建方法似乎严格遵循“映射”地址的原始意图:所有“映射”地址都返回Inet4Address对象 如果我想像这样运行isInSubnet测试: boolean inSubnet = (ip

我必须测试“IPv4映射地址”是否与某些ipv6网络前缀匹配,如2001:db8::/32

我已经阅读并理解了如何测试地址是否位于子网中

我不知道这些链接是否与我的上下文相关。据我所知,我们可以使用“映射”地址的有线格式创建128位IPv6地址,并在IPv6数据包头中传输。但是,Java的InetAddress创建方法似乎严格遵循“映射”地址的原始意图:所有“映射”地址都返回Inet4Address对象

如果我想像这样运行isInSubnet测试:

 boolean inSubnet = (ip ^ subnet) & netmask == 0;

对于这种测试,我必须将ip、子网和网络掩码转换为整数或长整数。但是,如果子网和网络掩码被表示为IPV6值,并且ip被强制为Inet4Address值,那么此测试是否有效?

如果您有足够的空间这样做,我建议您使用google class。它提供了一些很好的功能,您可以使用这些功能强制使用IPv4或其他功能。

给定IPv4地址1.2.3.4,IPv4映射地址是::ffff:1.2.3.4,它始终具有前缀0::ffff:0:0/96

在任何情况下,一般来说,为了测试ipv6地址是否位于给定的子网中,您可以使用,它可以执行ip地址操作,例如与ipv4/ipv6的转换和子网检查免责声明:我是项目经理

示例代码:

    String ipv6 = "2001:db8:57AB:0000:0000:0000:0000:0001";
    String ipv6subnet = "2001:db8::/32";
    String ipv4 = "1.2.3.4";
    try {
        IPAddressString ipv6addrstr = new IPAddressString(ipv6);
        IPAddressString ipv6addrsubnetstr = new IPAddressString(ipv6subnet);
        IPAddressString ipv4addrstr = new IPAddressString(ipv4);

        IPAddress ipv6addr = ipv6addrstr.toAddress();
        IPAddress ipv6addrsubnet = ipv6addrsubnetstr.toAddress();
        IPAddress ipv4mappedaddr = ipv4addrstr.toAddress().toIPv6();

        System.out.println(ipv6addrsubnet + " contains " + ipv6addr + " is " + ipv6addrsubnet.contains(ipv6addr)); //
        System.out.println(ipv6addrsubnet + " contains " + ipv4mappedaddr + " is " + ipv6addrsubnet.contains(ipv4mappedaddr)); //

    } catch(AddressStringException e) {
        //e.getMessage has validation error
    }
输出:

2001:db8:0:0:0:0:0:0/32 contains 2001:db8:57ab:0:0:0:0:1 is true
2001:db8:0:0:0:0:0:0/32 contains 0:0:0:0:0:ffff:102:304 is false

请重申/重新表述您的具体问题,并包括您提到的部分代码。