Expiring Today—Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

signed / unsigned integer problem

Posted on 2003-10-25
Medium Priority
158 Views
I have a function in C++:

unsigned int x, y, z;

y = seed;

x = (x & 0xffffff00) | *password;
y ^= x;
y += x;
x <<= 8;
y ^= x;
x <<= 8;
y -= x;
x <<= 8;
y ^= x;

z = y & 0x1f;
y = (y << z) | (y >> (32 - z));
}
return y;
}

... and i have converted it to PHP:

\$y = \$seed;
\$x = 0;
for (\$nr = 0, \$length = strlen(\$password); \$nr < \$length; \$nr++) {
\$x = (\$x & 0xFFFFFF00) | ord(\$password[\$nr]);
\$y ^= \$x;
\$y += \$x;
\$x <<= 8;
\$y ^= \$x;
\$x <<= 8;
\$y -= \$x;
\$x <<= 8;
\$y ^= \$x;

\$z = \$y & 0x1F;
\$y = (\$y << \$z) | (\$y >> (32 - \$z));
}
return \$y;
}

The problem is that it doesn't realy seem to return the same value.
I think the problem is that there are variables in the C++ code marked as unsigned int, which i can not do in PHP.
Can someone help me converting that so it will work correctly?

Example:
Calling code from C++:
gg_login_hash("dupa", 128) gives 1453413288 in a result.
0
Question by:Lukasz Lach
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
1 Comment

LVL 14

Accepted Solution

ThG earned 500 total points
ID: 9621561

Hmm, /me thinks.
From a quick debug looks like the \$y >> (32 - \$z) is performing an aritmetic shift right rather than a logical shift right, as it does (and should do) in C.
This made me think a little so i decided to check the PHP manual for the bitwise operators and in fact a comment points out that all the shift operations are signed (thus aritmetical). Very bad!

So here is a hackish workaround to clean the sign and complete the shifting:
...
\$z = \$y & 0x1F;
\$y1 = (\$y << \$z);
\$y2 = 0;
if (\$z < 32) {
\$y2 = \$y >> 1;
\$y2 &= 0x7fffffff;
\$y2 = \$y2 >> (31 - \$z);
}
\$y = \$y1 | \$y2;
...

I'm the best PHP coder ;-)
0

Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Popularity Can Be Measured Sometimes we deal with questions of popularity, and we need a way to collect opinions from our clients.  This article shows a simple teaching example of how we might elect a favorite color by letting our clients vote for …