xor hex and decimal

Hi there,

I need to write a small function that will xor a hex value with a decimal value.

can someone please help with a small example.

Who is Participating?
sunnycoderConnect With a Mentor Commented:

you can cast a char to an int .... I am a bit confused now

you read a char 'A' (hex 41 )

char first = 'A';

you can xor it with an int as such

first ^ 22 is perfectly valid and legal ... there is no need for any conversion here

Hi morees,

hex or decimal does not matter as long as you use the xor operator correctly

x = 56 ^ 0xE4; is perfectly valid though a bit unintuitive

moreesAuthor Commented:

better explain this a bit more.

I need to read the char from a file, convert that char to hex an then xor it with an integer value read from a file.

My program boms out at the xor with invalid variant type conversion.
How can I cast the hex value to "1F" to 0x1F so that the xor will work.

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

> need to read the char from a file

Do you mean you have a text file with a text (ASCII) representation of a number in it?
moreesAuthor Commented:
the one file is a binary file that was xored with a key and the key file just contains the key.

the key file look like this

a byte at position x in the source file must be xored with the byte at position x in the key file.

that is what I want to do
The key file looks like ASCII.

> 141592653589793238462643383279502884197169...

Is the 2nd byte '4' as in 0x34?
moreesAuthor Commented:
i think it should be..
Hi morees,
> the key file look like this
> 141592653589793238462643383279502884197169......

> a byte at position x in the source file must be xored with the byte at
> position x in the key file.

To understand you correctly: As the key is in hex-ascii the key file is twice as long as the encoded file, right?

For the hex->int conversion, you *could* use the strtol() function:

int hexbyte=strtol(hexstring,NULL,16);
(hexstring MUST be \0 at the third byte)

This won't be terribly efficient, though probably better by eons than a fscanf() solution. You could convert 4 bytes (or even 8 using strtoll) at once, but then you'll skid into endianess issues.

Recommendation: Use a lookup table. Here's a Perl program to create one:
my $i;
my @tab;
for $i (0 .. 0xff){
      my ($hi,$lo) = unpack("C2",sprintf "%02x",$i);
      my $arridx=($hi << 8) + $lo;
      ($hi,$lo) = unpack("C2",sprintf "%02X",$i);
      $arridx=($hi << 8) + $lo;

print "#define ERR -1\nshort lookup[65536]={";
for $i (0 .. 0xffff){
      print "\n\t" if ($i & 0xf) == 0;
      if(defined $tab[$i]){
            printf "0x%02x,",$tab[$i];
      } else {
            print  " ERR,";
print "\n};\n";

The lookup logic is: "94" -> ASCII 0x3934 -> lookup[0x3934] -> 0x94
The nice side effect is that you'll have both upper & lower hex values and you can detect errors without major extra effort -> faaaast.

In case you ask "why is this table defined as short?": All 256 possible values of (unsigned) char are valid, so you need a larger data type to store the error condition.

Do something like the following:

#include <fstream>
#include <iostream>
using std::fstream;
using std::ios_base;
using std::cout;
using std::endl;

// open binary file
fstream f("my file.bin", ios_base::binary | ios_base::in);

unsigned short decimal_val = 12;
while (!f.eof())
    char c;
    // read char
    f.read(&c, 1);
    // do what you like, xor the value with our decimal and print it
    cout << (c ^ decimal_val) << endl;  

Stefan73, you assume morees knows perl ? ....
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.