JavaScript中两个十六进制字符串的异或

XOR of two hex strings in JavaScript

1
2
3
4
5
6
var hex1 ="B1C85C061C98E713DEF0E2EDDDDB432738674C9F8962F09B75E943D55F9FB39F";
var hex2 ="121B0D3327A21B8048FC7CA6FD07AACC0D8DF59B99DB098686696573E3686E6C";

var result = hex1 ^ hex2; //XOR the values

console.log(result); // outputs: 0 which does not sound good.

任何想法如何对十六进制值执行异或运算?


JavaScript 中的位运算仅适用于数值。

你应该 parseInt(hexString, 16) 你的十六进制字符串之前。特别是在您的情况下,这是行不通的,因为您的十六进制对于数字来说太大了。您必须创建自己的自定义 XOR 函数。

看看这个链接:How to convert hex string into a bytes array, and a bytes array in the hex string?

生成的字节数组将可用于手动 XOR。一个字节一个字节。也许这会有所帮助:Java XOR over two arrays.


1
2
3
4
5
6
7
str = 'abc';
c = '';
key = 'K';
for(i=0; i<str.length; i++) {
    c += String.fromCharCode(str[i].charCodeAt(0).toString(10) ^ key.charCodeAt(0).toString(10)); // XORing with letter 'K'
}
return c;

字符串\\'abc\\'的输出:

1
"*)("


如果您使用的是 Nodejs,您可以将十六进制字符串转换为 Buffers,然后使用 map 构建生成的字符串。

1
2
3
4
5
6
function xor(hex1, hex2) {
  const buf1 = Buffer.from(hex1, 'hex');
  const buf2 = Buffer.from(hex2, 'hex');
  const bufResult = buf1.map((b, i) => b ^ buf2[i]);
  return bufResult.toString('hex');
}

你可以使用这样的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function xor(a, b) {
  if (!Buffer.isBuffer(a)) a = new Buffer(a)
  if (!Buffer.isBuffer(b)) b = new Buffer(b)
  var res = []
  if (a.length > b.length) {
    for (var i = 0; i < b.length; i++) {
       res.push(a[i] ^ b[i])
    }
 } else {
 for (var i = 0; i < a.length; i++) {
   res.push(a[i] ^ b[i])
   }
 }
 return new Buffer(res);
}

来源:https://github.com/czzarr/node-bitwise-xor


下面是接收两个字符串的函数,如 "041234FFFFFFFFFF" 和 "0000000709000003"(引脚块和卡块的经典示例)
上述 2 个字符串的预期结果是 "041234F8F6FFFFFC"

1
2
3
4
5
6
7
8
function bitwiseXorHexString(pinBlock1, pinBlock2) {
  var result = ''
  for (let index = 0; index < 16; index++) {
    const temp = (parseInt(pinBlock1.charAt(index), 16) ^ parseInt(pinBlock2.charAt(index), 16)).toString(16).toUpperCase()
    result += temp
  }
  return result
}

注意:这是对 2 个固定长度为 16 的字符串进行异或运算。您可以根据需要对其进行修改。