如何异或 4 字节数组

我在尝试对 4 个不同的字节数组进行异或时遇到问题。根据我对异或的理解,A XOR B = C; B 异或 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操作缺乏了解。


慕田峪4524236
浏览 315回答 3
3回答

慕标琳琳

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

撒科打诨

我会怎么做:byte[] xor(byte[] a, byte[] b) {&nbsp; if (a.length != b.length) throw new IllegalArgumentException();&nbsp; byte[] c = new byte[a.length];&nbsp; for (int i = 0; i < a.length; i++) {&nbsp; &nbsp; c[i] = a[i] ^ b[i];&nbsp; }&nbsp; return c;}然后你可以测试一下:byte[] b1 = ..., b2 = ... b3 = ..., b4 = ...;byte[] b5 = xor(b1, xor(b2, xor(b3, b4)));

胡说叔叔

像这样对任意数量的数组的字节进行异或。public static byte[] xor(byte[]... arrays) {&nbsp; &nbsp; int len = 0;&nbsp; &nbsp; for (byte[] array : arrays)&nbsp; &nbsp; &nbsp; &nbsp; len = Math.max(len, array.length);&nbsp; &nbsp; byte[] result = new byte[len];&nbsp; &nbsp; for (int i = 0; i < len; i++) {&nbsp; &nbsp; &nbsp; &nbsp; byte b = 0;&nbsp; &nbsp; &nbsp; &nbsp; for (byte[] array : arrays)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b ^= i < array.length ? array[i] : 0;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; result[i] = b;&nbsp; &nbsp; }&nbsp; &nbsp; return result;}注意:为避免混淆,我创建了一个新数组并返回该数组,而不是返回最长的字节 []。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java