簡體   English   中英

如何對4字節數組進行XOR

[英]How to XOR 4 byte arrays

我在嘗試異或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。

因此,我想知道代碼是否存在問題,或者是由於我對XOR操作缺乏了解而導致的。

這與XOR無關,但是在計算時會覆蓋數組。 調用該方法后的內容與以前不同。 此外,結果數組是輸入數組之一。 這會導致各種混疊問題。

我將如何做:

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)));

要對任意數量的數組的字節進行XOR運算,如下所示。

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;
}

注意:為避免混淆,我創建了一個新數組並將其返回,而不是返回最長的byte []。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM