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 中的位运算仅适用于数值。
你应该
看看这个链接: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,您可以将十六进制字符串转换为
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 的字符串进行异或运算。您可以根据需要对其进行修改。