如何对4字节数组进行XOR

时间:2018-07-28 14:42:12

标签: java arrays xor

我在尝试对4个不同的字节数组进行XOR时遇到问题。根据我对XOR的了解,A XOR B = C; B XOR C = A。

public static byte[] test(byte[] b1, byte[] b2, byte[] b3, byte[] b4) {
    if (b1.length > b2.length) {
        byte[] tmp = b2;
        b2 = b1;
        b1 = tmp;
    }
    for (int i = 0; i < b1.length; i++) {
        b2[i] ^= b1[i];
    }

    if (b2.length > b3.length) {
        byte[] tmp = b3;
        b3 = b2;
        b2 = tmp;
    }
    for (int i = 0; i < b2.length; i++) {
        b3[i] ^= b2[i];
    }

    if (b3.length > b4.length) {
        byte[] tmp = b4;
        b4 = b3;
        b3 = tmp;
    }
    for (int i = 0; i < b3.length; i++) {
        b4[i] ^= b3[i];
    }

    return b4;
}

我有4个字节数组:b1,b2,b3,b4。我用上面的方法给了我一个叫做b5的字节数组。

现在让我们说得到b1,在上述方法中我们将使用b2,b3,b4,b5作为参数。但是,这不会给我b1。

所以我想知道代码是否有问题,或者是由于我对XOR操作缺乏了解。

3 个答案:

答案 0 :(得分:3)

这与XOR无关,但是您在计算数组时会覆盖它。调用该方法后的内容与以前不同。此外,结果数组是输入数组之一。这会导致各种混叠问题。

答案 1 :(得分:2)

我该怎么做:

byte[] xor(byte[] a, byte[] b) {
  if (a.length != b.length) throw new IllegalArgumentException();
  byte[] c = new byte[a.length];
  for (int i = 0; i < a.length; i++) {
    c[i] = a[i] ^ b[i];
  }
  return c;
}

然后您可以对其进行测试:

byte[] b1 = ..., b2 = ... b3 = ..., b4 = ...;
byte[] b5 = xor(b1, xor(b2, xor(b3, b4)));

答案 2 :(得分:0)

要对任意数量的数组字节进行XOR运算。

.highcharts-point-select

注意:为避免混淆,我创建了一个新数组并将其返回,而不是返回最长的字节[]。