You are here: Re: [PHP] Strange Right-Shift Problem « PHP « IT news, forums, messages
Re: [PHP] Strange Right-Shift Problem

Posted by Michael Gross on 12/30/05 22:54

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

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация