java

时间:2016-05-09 12:11:42

标签: java ipv6

我有两个IPv6地址的二进制表示

例如: 第一个字符串是

的二进制表示
'2001:4E8:0:4000:0:0:0:0'
'00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000'

第二个字符串二进制表示

 '0:0:0:0:ffff:ffff:ffff:ffff'
 '00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111'

现在我想做一个biwise' AND'对IPv6地址及其掩码的操作。 在java中实现这个目标的好方法是什么?

P:S:Integer.parseInt仅支持32位操作

3 个答案:

答案 0 :(得分:4)

您可以使用BigInteger' s and()

BigInteger first = new BigInteger("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000",2);
BigInteger second = new BigInteger("00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111",2);
BigInteger and = first.and(second);

答案 1 :(得分:2)

您可以使用BitSet。但为此你需要将String转换为字节数组

public static byte[] toByteArray(String bytes){
    byte[] bb = new byte[bytes.length()/8];
    byte m1 = (byte) (1 << 7);
    for(int i = 0, j = 0; i < bb.length; i++, j=i*8){
        byte b = bytes.charAt(j) == '1' ? m1 : 0;
        b |= Byte.valueOf(bytes.substring(j + 1, j + 8), 2);
        System.out.println(Integer.toBinaryString(b));
        bb[i] = b;
    }
    return bb;
}

现在你可以在BitSet中使用它了

BitSet bs1 = BitSet.valueOf(toByteArray("00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111"));
BitSet bs2 = BitSet.valueOf(toByteArray("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000"));
BitSet bs3 = bs1.and(bs2);

答案 2 :(得分:1)

我假设您开始使用标准IPv6表示法中的IPv6地址和网络掩码...而不是由'0''1'字符组成的二进制字符串表示。

如果您在IPv6地址文字上使用InetAddress.getByName(String),则会获得Inet6Address个对象。如果您对此致电getAddress(),您将获得原始地址byte[]。你也可以这样做,从网络掩码中获得byte[]

然后,您可以遍历相应的字节数组并对它们使用按位运算。