繁体   English   中英

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

[英]How to XOR two byte arrays of different length

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

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

  1. b3 X2 b2给我b1
  2. b3将 b1异或给我b2

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

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。

一种解决方案是采用最大长度,这样就不会丢失任何信息,但是假定尾随的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM