Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中128位的按位操作_Java_Ipv6 - Fatal编程技术网

java中128位的按位操作

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

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

例如: 第一个字符串是的二进制表示形式

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