2010-11-07 5 views
3

У меня есть некоторые C# код, который выглядит следующим образом:Как заставить PHP для лечения ряда как UINT

uint a = 0x9E3779B9; 
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24)); 

После этого кода, в == 228 452 386

Сейчас я пытаюсь перевести этот C# код на PHP, но в PHP число не переполнить таким же образом:

$a = 0x9E3779B9; 
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24)); 

После этого кода $ а == 4 523 419 682

В обоих случаях «url» рассматривается как массив значений ascii. Возвращает те же результаты до момента добавления $ a к результату второй строки. В этот момент C# uint переполняется до ~ 228 миллионов. PHP становится «умным» и придумывает «правильный» ответ.

Но я хочу переполненный ответ, который дает C#. Что мне делать?

ответ

5

Добавить $a &= 0xFFFFFFFF, чтобы вернуть значение в 32-разрядный диапазон после того, как вы сделали +=.

(См: http://www.ideone.com/6BR0U)

0

Это было в то время и рабочий ответ уже был представлен, но я просто хотел, чтобы выделить более простой способ выполнить распаковку, что вы делаете:

$a = 0x9e3779b9; 
$url = 'info'; 

$a = ($a + current(unpack('L', $url))) & 0xffffffff; 

printf("%u\n", $a); // 228452387 

Я использую unpack() для выполнения преобразования из двоичного в uint32 (машинный порядок байтов). На 32-битных платформах конечный результат может стать отрицательным, поэтому я также использую printf() для правильного форматирования результата.