为了账号安全,请及时绑定邮箱和手机立即绑定

如何异或 4 字节数组

如何异或 4 字节数组

慕田峪4524236 2021-06-14 09:16:21
我在尝试对 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操作缺乏了解。
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-06-17
?
撒科打诨

TA贡献1934条经验 获得超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)));


查看完整回答
反对 回复 2021-06-17
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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


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;

}

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


查看完整回答
反对 回复 2021-06-17
  • 3 回答
  • 0 关注
  • 314 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信