java中128位的按位操作
我有两个IPv6地址的二进制表示 例如: 第一个字符串是的二进制表示形式java中128位的按位操作,java,ipv6,Java,Ipv6,我有两个IPv6地址的二进制表示 例如: 第一个字符串是的二进制表示形式 '2001:4E8:0:4000:0:0:0:0' '00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000' 二串二进制表示法 '0:0:0:0:ffff:ffff:ffff:ffff' '0000000000000
'2001:4E8:0:4000:0:0:0:0'
'00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000'
二串二进制表示法
'0:0:0:0:ffff:ffff:ffff:ffff'
'00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111'
现在,我想对IPv6地址及其掩码执行一个双“和”操作。
用java实现这一点的好方法是什么
p:S:Integer.parseInt仅支持32位操作您可以使用BigInteger和:
您可以使用BigInteger和:
我假设您以标准IPv6表示法的IPv6地址和网络掩码开始。。。不是由“0”和“1”字符组成的二进制字符串表示形式 如果在IPv6地址文本上使用InetAddress.getByNameString,则会得到一个Inet6Address对象。如果您在此调用getAddress,您将以字节[]的形式获得原始地址。您也可以从网络掩码获取字节[]
然后,您可以在各自的字节数组上循环,并对其使用逐位操作。我假设您从IPv6地址和标准IPv6表示法的网络掩码开始。。。不是由“0”和“1”字符组成的二进制字符串表示形式 如果在IPv6地址文本上使用InetAddress.getByNameString,则会得到一个Inet6Address对象。如果您在此调用getAddress,您将以字节[]的形式获得原始地址。您也可以从网络掩码获取字节[]
然后,您可以在相应的字节数组上循环,并对其使用按位操作。您可以为此使用位集。但为此,您需要将字符串转换为字节数组
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;
}
您可以为此使用位集。但为此,您需要将字符串转换为字节数组
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;
}
考虑使用BigType或两个Losis考虑使用BigType或两个Lyth.非常感谢您的建议.谢谢您的建议.简单、完善、简单、完善.
BitSet bs1 = BitSet.valueOf(toByteArray("00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111"));
BitSet bs2 = BitSet.valueOf(toByteArray("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000"));
BitSet bs3 = bs1.and(bs2);