var hex1 = "B1C85C061C98E713DEF0E2EDDDDB432738674C9F8962F09B75E943D55F9FB39F";
var hex2 = "121B0D3327A21B8048FC7CA6FD07AACC0D8DF59B99DB098686696573E3686E6C";
var result = hex1 ^ hex2; //XOR the values
console.log(result); // outputs: 0 which does not sound good.
如何对十六进制值执行XOR运算?
答案 0 :(得分:8)
JavaScript中的按位操作仅适用于数值。
之前你应该parseInt(hexString, 16)
你的十六进制字符串。特别是在你的情况下,这不起作用,因为你的十六进制对于一个数字来说太大了。您必须创建自己的自定义XOR函数。
请看一下这个链接:How to convert hex string into a bytes array, and a bytes array in the hex string?
对于手动XOR,生成的bytearray将易于识别。按字节字节。也许这会有所帮助:Java XOR over two arrays。
答案 1 :(得分:4)
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 ':
"*)("
答案 2 :(得分:3)
你可以使用这样的功能。
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);
}
答案 3 :(得分:0)
下面是接受2个字符串的函数,例如“ 041234FFFFFFFFFFFF”和“ 0000000709000003”(引脚块和卡块的经典示例) 上述2个字符串的预期结果是“ 041234F8F6FFFFFC”
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的字符串进行的。您可以根据需要进行修改。
答案 4 :(得分:0)
如果您使用的是 Nodejs,则可以将十六进制字符串转换为 Buffer
,然后使用 map
构建结果字符串。
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');
}