java中128位的按位运算

问题描述 投票:0回答:4

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

例如: 第一个字符串是

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

第二个字符串二进制表示

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

现在我想对 IPv6 地址及其掩码进行双向“AND”运算。 在java中实现这一点的好方法是什么?

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

java ipv6
4个回答
4
投票

您可以使用

BigInteger
and()

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

2
投票

您可以使用 BitSet 来实现此目的。但为此,您需要将字符串转换为字节数组

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);

1
投票

我假设您一开始使用的是标准 IPv6 表示法中的 IPv6 地址和网络掩码……而不是由

'0'
'1'
字符组成的二进制字符串表示形式。

如果在 IPv6 地址文字上使用

InetAddress.getByName(String)
,您将获得一个
Inet6Address
对象。如果您对此调用
getAddress()
,您将获得
byte[]
形式的原始地址。您可以执行相同的操作从网络掩码中获取
byte[]

然后您可以循环遍历各个字节数组并对它们使用按位运算。


0
投票

使用 开源 IPAddress Java 库,您可以按如下方式执行此操作。免责声明:我是该图书馆的项目经理。

IPAddress result = new IPAddressString("2001:4E8:0:4000::").getAddress().
    mask(new IPAddressString("::ffff:ffff:ffff:ffff").getAddress());

您实际上不需要生成字符串二进制表示形式,尽管如果您确实希望这样做,该库有一个您可以使用的

toBinaryString()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.