Solved

# xor hex and decimal

Posted on 2004-04-01
3,809 Views
Hi there,

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

Thanks
0
Question by:morees
• 3
• 2
• 2
• +2

LVL 45

Expert Comment

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

Sunnycoder
0

Author Comment

Thanks,

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.

0

LVL 45

Accepted Solution

sunnycoder earned 50 total points
morees,

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

Sunnycoder
0

LVL 17

Expert Comment

> 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?
0

Author Comment

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
141592653589793238462643383279502884197169......

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
0

LVL 17

Expert Comment

The key file looks like ASCII.

> 141592653589793238462643383279502884197169...

Is the 2nd byte '4' as in 0x34?
0

Author Comment

i think it should be..
0

LVL 12

Expert Comment

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;
\$tab[\$arridx]=\$i;
(\$hi,\$lo) = unpack("C2",sprintf "%02X",\$i);
\$arridx=(\$hi << 8) + \$lo;
\$tab[\$arridx]=\$i;
}

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.

Cheers,
Stefan
0

LVL 12

Expert Comment

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.

Stefan
0

LVL 6

Expert Comment

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;
// do what you like, xor the value with our decimal and print it
cout << (c ^ decimal_val) << endl;
}

Stefan73, you assume morees knows perl ? ....
0

## Featured Post

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generatâ€¦
Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base classâ€¦
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.