Как заставить PHP воспринимать число как uint - PullRequest
3 голосов
/ 07 ноября 2010

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

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));

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

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

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

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

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

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

0 голосов
/ 03 сентября 2013

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

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

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

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

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

...