Reverse biwise operation and xor?

M

Mrki [MCAD]

I have a rather interesting code with 3 input variables that produce
result (this is a decoder and written by unknown author).

I have to get cd variable by konwing cl, fm and result of the
function...
is this possible?

Code:
#define MAKE_TAG_ID( cl, fm, cd)\
((((UL)(cl)) << ((TB -1) * 8)) | (((UL)(fm)) << ((TB -1) * 8)) |
(MAKE_TAG_ID_CODE (((UL)(cd)))))

And this is related code:

#define MAKE_TAG_ID_CODE(cd)\
( (cd < 31) ? (MAKE_TAG_ID_CODE1 (cd)):\
((cd < 128)? (MAKE_TAG_ID_CODE2 (cd)):\
((cd < 16384)? (MAKE_TAG_ID_CODE3 (cd)):\
(MAKE_TAG_ID_CODE4 (cd)))))


#define MAKE_TAG_ID_CODE1(cd) (cd << ((TB -1) * 8))


#define MAKE_TAG_ID_CODE2(cd) ((31 << ((TB -1) * 8)) | (cd << ((TB-2)
* 8)))


#define MAKE_TAG_ID_CODE3(cd) ((31 << ((TB -1) * 8))\
| ((cd & 0x3f80) << 9)\
| ( 0x0080 << ((TB-2) * 8))\
| ((cd & 0x007F) << ((TB-3)* 8)))



#define MAKE_TAG_ID_CODE4(cd) ((31 << ((TB -1) * 8))\
| ((cd & 0x1fc000) << 2)\
| ( 0x0080 << ((TB-2) * 8))\
| ((cd & 0x3f80) << 1)\
| ( 0x0080 << ((TB-3) * 8))\
| ((cd & 0x007F) << ((TB-4)*8)))

Thanx for any help
 
W

Walter Roberson

I have a rather interesting code with 3 input variables that produce
result (this is a decoder and written by unknown author).
I have to get cd variable by konwing cl, fm and result of the
function...
is this possible?

Not with that code, no.

Your Subject heading refers to 'xor', but there are no
xor operations in the code you show, only bitwise or.
Code:
#define MAKE_TAG_ID( cl, fm, cd)\
((((UL)(cl)) << ((TB -1) * 8)) | (((UL)(fm)) << ((TB -1) * 8)) |
(MAKE_TAG_ID_CODE (((UL)(cd)))))
And this is related code:
#define MAKE_TAG_ID_CODE(cd)\
( (cd < 31) ? (MAKE_TAG_ID_CODE1 (cd)):\
((cd < 128)? (MAKE_TAG_ID_CODE2 (cd)):\
((cd < 16384)? (MAKE_TAG_ID_CODE3 (cd)):\
(MAKE_TAG_ID_CODE4 (cd)))))
#define MAKE_TAG_ID_CODE1(cd) (cd << ((TB -1) * 8))

Consider the case of cd < 31. In that case, MAKE_TAG_ID_CODE1
is used, the result of which will be (cd << ((TB -1) * 8)) .
That will be inclusive-or'd with (((UL)(cl)) << ((TB -1) * 8))
and with (((UL)(fm)) << ((TB -1) * 8)) . Notice that
all three parts are left-shifted by the same amount, so the
"interesting" part of the value will be cl | fm | cd
Now in any bit position where cl | fm is 1, you cannot tell
the difference between cl | fm and cl | fm | cd
because 1 bitwise or'd with anything else is still 1 .

Thus, you cannot uniquely calculate cd knowing cl, fm, and
the result of the function -- not unless you have further information
to know that the bottom five bits of cl and fm are always 0.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top