user2577497
user2577497

Reputation: 497

How to use the XOR "^" on two strings

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.

Upvotes: 2

Views: 8221

Answers (1)

Bergi
Bergi

Reputation: 665344

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

Upvotes: 8

Related Questions