如何对两个不同长度的字节数组进行异或

时间:2018-07-29 07:04:23

标签: java arrays byte xor

我有两个不同长度的byte []变量,这些变量将用于XOR以给我第三个变量。我们称它们为 b1 b2 ,以及第三个变量 b3

使用第三个变量,我可以:

  1. b3 XOR b2 给我 b1
  2. b3 XOR b1 给我 b2

但是,由于 b1 b2 的长度不同,我有一个问题。

public static byte[] xor(byte[] b1, byte[] b2) {
    byte[] oneAndTwo = new byte[Math.min(b1.length, b2.length)];
    for (int i = 0; i < oneAndTwo.length; i++) {
        oneAndTwo[i] = (byte) (((int) b1[i]) ^ ((int) b2[i]));
    }
    return oneAndTwo;
}

public static void main(String[] args) throws UnsupportedEncodingException {
    byte[] b1 = "Hi".getBytes("UTF-8");
    byte[] b2 = "Hello".getBytes("UTF-8");
    byte[] b3 = XORTest.xor(b1, b2);

    byte[] mb1 = XORTest.xor(b2, b3);
    byte[] mb2 = XORTest.xor(b1, b3);

    System.out.println(Arrays.equals(b1, mb1));   //prints true
    System.out.println(new String(mb1, "UTF-8")); //prints "Hi"

    System.out.println(Arrays.equals(b2, mb2));   //prints false
    System.out.println(new String(mb2, "UTF-8")); //prints "He"
}

所以我想知道是否有一种方法可以对两个不同长度的byte []执行XOR。

1 个答案:

答案 0 :(得分:0)

一种解决方案是采用最大长度,这样就不会丢失任何信息,但是假定尾随的0个字节应被截断。

public static byte[] xor(byte[] b1, byte[] b2) {
    byte[] oneAndTwo = new byte[Math.max(b1.length, b2.length)];
    for (int i = 0; i < b1.length && i < b2.length; i++)
        oneAndTwo[i] = (byte) (b1[i] ^ b2[i]);
    for (int i = b2.length; i < b1.length; i++)
        oneAndTwo[i] = b1[i];
    for (int i = b1.length; i < b2.length; i++)
        oneAndTwo[i] = b2[i];
    int length = oneAndTwo.length;
    while (length > 0 && oneAndTwo[length - 1] == 0)
        length--;
    if (length < oneAndTwo.length)
        return Arrays.copyOf(oneAndTwo, length);
    return oneAndTwo;
}

public static void main(String[] args) {
    byte[] b1 = "Hi".getBytes(StandardCharsets.UTF_8);
    byte[] b2 = "Hello".getBytes(StandardCharsets.UTF_8);
    byte[] b3 = xor(b1, b2);

    byte[] mb1 = xor(b2, b3);
    byte[] mb2 = xor(b1, b3);

    System.out.println(Arrays.equals(b1, mb1));  
    System.out.println(new String(mb1, StandardCharsets.UTF_8));

    System.out.println(Arrays.equals(b2, mb2));   
    System.out.println(new String(mb2, StandardCharsets.UTF_8));
}

打印

true
Hi
true
Hello