java 中 128 位的按位运算
Bitwise operations on 128 bit in java
我有两个 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 位操作
您可以使用 BigInteger
的 and()
:
BigInteger first = new BigInteger("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000",2);
BigInteger second = new BigInteger("00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111",2);
BigInteger and = first.and(second);
我假设您开始时使用的是标准 IPv6 表示法中的 IPv6 地址和网络掩码 ... 而不是由 '0'
和 '1'
字符组成的二进制字符串表示形式。
如果您在 IPv6 地址文字上使用 InetAddress.getByName(String)
,您将得到一个 Inet6Address
对象。如果您对此调用 getAddress()
,您将获得 byte[]
形式的原始地址。您可以执行相同的操作以从网络掩码中获取 byte[]
。
然后你可以遍历各个字节数组并对它们进行按位运算。
您可以为此使用 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);
我有两个 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 位操作
您可以使用 BigInteger
的 and()
:
BigInteger first = new BigInteger("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000",2);
BigInteger second = new BigInteger("00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111",2);
BigInteger and = first.and(second);
我假设您开始时使用的是标准 IPv6 表示法中的 IPv6 地址和网络掩码 ... 而不是由 '0'
和 '1'
字符组成的二进制字符串表示形式。
如果您在 IPv6 地址文字上使用 InetAddress.getByName(String)
,您将得到一个 Inet6Address
对象。如果您对此调用 getAddress()
,您将获得 byte[]
形式的原始地址。您可以执行相同的操作以从网络掩码中获取 byte[]
。
然后你可以遍历各个字节数组并对它们进行按位运算。
您可以为此使用 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);