I have two strings:
var temp1 = "6219000041889600";
var temp2 = "FFFFFFFFFFFFFFFF";
I would like to XOR these two, however I know that in JavaScript you cannot XOR string and can only for int.
So Is there a way to do this? I know for the first value i can use:
var temp1_A= parseInt(temp1); //equal to 6219000041889600
However
var temp1_B= parseInt(temp12,16) // yields 1152921504606847000
Then performing temp1_A ^ temp1_B
yields 1159140504648736600
(but this is decimal) and converting back to HEX is 10161825C85ADF58
which is not my desired result.
It should be (when both hex according to Here)
6219000041889600 ^ FFFFFFFFFFFFFFFF = 9DE6FFFFBE7769FF`
but how would I go about XOR'ing this value with 8-bytes of FF.
I have two strings:
var temp1 = "6219000041889600";
var temp2 = "FFFFFFFFFFFFFFFF";
I would like to XOR these two, however I know that in JavaScript you cannot XOR string and can only for int.
So Is there a way to do this? I know for the first value i can use:
var temp1_A= parseInt(temp1); //equal to 6219000041889600
However
var temp1_B= parseInt(temp12,16) // yields 1152921504606847000
Then performing temp1_A ^ temp1_B
yields 1159140504648736600
(but this is decimal) and converting back to HEX is 10161825C85ADF58
which is not my desired result.
It should be (when both hex according to Here)
6219000041889600 ^ FFFFFFFFFFFFFFFF = 9DE6FFFFBE7769FF`
but how would I go about XOR'ing this value with 8-bytes of FF.
Share Improve this question edited Jun 4, 2015 at 18:20 Evan Davis 36.6k7 gold badges52 silver badges58 bronze badges asked Jun 4, 2015 at 18:06 user2577497user2577497 4979 silver badges17 bronze badges 2- 1 JavaScript's binary operators currently only support up to 32-bit integers (4 bytes). To exceed that, you'll have to process the strings in segments that fit under that limit and concatenate the results. – Jonathan Lonowski Commented Jun 4, 2015 at 18:13
- You'll need to either look for a BigInt implementation, or parse those hex strings to arrays of 32-bit ints and do the operation manually. – David Ehrmann Commented Jun 4, 2015 at 18:20
1 Answer
Reset to default 8You've left the bounds of the 31-bit integer precision in JavaScript. You'll need to process your strings in chunks:
function XOR_hex(a, b) {
var res = "",
l = Math.max(a.length, b.length);
for (var i=0; i<l; i+=4)
res = ("000"+(parseInt(a.slice(-i-4, -i||a.length), 16) ^ parseInt(b.slice(-i-4, -i||b.length), 16)).toString(16)).slice(-4) + res;
return res;
}
or maybe easier char-by-char:
function XOR_hex(a, b) {
var res = "",
i = a.length,
j = b.length;
while (i-->0 && j-->0)
res = (parseInt(a.charAt(i), 16) ^ parseInt(b.charAt(j), 16)).toString(16) + res;
return res;
}