我有两个不同长度的byte []变量,这些变量将用于XOR以给我第三个变量。我们称它们为 b1 和 b2 ,以及第三个变量 b3 。
使用第三个变量,我可以:
但是,由于 b1 和 b2 的长度不同,我有一个问题。
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 :(得分:0)
一种解决方案是采用最大长度,这样就不会丢失任何信息,但是假定尾随的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