【问题标题】:How to XOR 4 byte arrays如何异或 4 字节数组
【发布时间】:2019-01-05 10:21:13
【问题描述】:

我在尝试异或 4 个不同的字节数组时遇到问题。根据我对 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。

所以我想知道是代码有问题还是因为我对异或运算缺乏了解。

【问题讨论】:

  • 显示您的示例输入。在你异或之后,你正在交换一大堆东西。您应该在开始之前直接获得订单。

标签: java arrays xor


【解决方案1】:

像这样对任意数量的数组的字节进行异或运算。

public static byte[] xor(byte[]... arrays) {
    int len = 0;
    for (byte[] array : arrays)
        len = Math.max(len, array.length);
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++) {
        byte b = 0;
        for (byte[] array : arrays) 
            b ^= i < array.length ? array[i] : 0; 
        result[i] = b;
    }
    return result;
}

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

【讨论】:

    【解决方案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)));
    

    【讨论】:

    • 解释一下为什么会很好。
    • 更干净,更简单,并且不改变输入。
    【解决方案3】:

    这与 XOR 无关,但在计算时会覆盖数组。调用方法后的内容和之前不一样了。此外,您的结果数组是输入数组之一。这会导致各种别名问题。

    【讨论】:

    • 我没有考虑过。很好看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多