Hello
Thanks for your answers. I now implemented everything new, with the
mcrypt-extension. However, I use the crypt_xtea still for a
compatibility mode. I had to implement the right-shift and other bit
operations. If someone is interested:
The problem occurred always when a number exceeded the 32bit and is
negative. The old behavior was to take 32bits and ignore the other bits
(therefore the sign could change in the rshift-operation). The following
simulates the old behavior:
function getbits($i) {
$bits = array();
while (abs($i) > 1) {
$f1 = floor($i / 2.0);
$f2 = ceil($i / 2.0);
if ($f1!=$f2) {
array_push($bits, 1);
} else {
array_push($bits, 0);
}
$i = $f1;
}
return $bits;
}
function convertto32($i) {
$bits = getbits($i);
$i = 0;
if ($bits[ 0]) $i|=0x00000001;
if ($bits[ 1]) $i|=0x00000002;
....
if ($bits[31]) $i|=0x80000000;
return $i;
}
function rshift($i, $n) {
if ($i < -2147483648) {
$i = convertto32($i);
}
return $i >> $n;
}
thx
Michael Gross
Richard Lynch wrote:
On Thu, December 29, 2005 5:37 pm, Michael Gross wrote:
Hello
I have to migrate a PHP-application to a new Linux-Box. Both the old
and
the new system are Linux and PHP 5.1.1. (the old one has a Pentium 4,
the new one two Xeon CPUs). I have a problem using the
Crypt_Xtea-Extension. I narrowed it down to the following right-shift
operation:
(-3281063054 >> 11) produces different results:
Old System: 495070
New System: -1048576
I understand that both results are "wrong", but everything worked with
the old behavior and I need that behavior back very urgent.
Maybe someone can explain me in which way the bits are shifted so that
the result is 495070? If I understand it, I implement my "own" shift
function.
Assuming the previous hypothesis that it's 32-bit versus 64-bit
machines at work...
If you can determine the number of bits on your system, you could use
a different number from 11 on the two systems to get the answer you
want.
if (is_32_bit_machine()){
$y = $x >> 11;
}
else{
$y = $x >> 43; //11 + 32 (guess)
}
One hack for detecting 32-bit machine might be this:
function is_32_bit_machine(){
return mt_getrandmax() == 0xffffffff;
}
I suppose if you're going to do this right, what you REALLY should do
is code it to determine the number of bits, no matter how large, and
then bit-shift the correct amount based on that.
So when the 128-bit machines come out in a few years, you aren't
re-coding this same damn problem AGAIN.
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php