Как переписать функцию с js на php?

Привет! Помогите, пожалуйста, переписать функцию с js на php или найти ошибку в том, как переписал её я.
Функция такая:
function io(ej, Ka) {
        var gd = Ka;
        var as = ej;

        return function() {
            var cZ = as;
            var K2 = gd;
            as = K2;
            cZ = cZ ^ (cZ << 23);
            cZ = cZ ^ (cZ >> 17);
            cZ = cZ ^ K2;
            cZ = cZ ^ (K2 >> 26);
            gd = cZ;
            return (as + gd) % 4294967296;
        };
    }


И её вызов вот тут:
var pJ = io(612538604, OG);

   var SI = [];
   var NX = 0;
   for (; NX < 50;) {
         SI.push(pJ() & 255);
         NX = NX + 1;
   }


Я переписал и вызываю вот так, но правильно отрабатывает только первая итерация цикла:
Моя попытка

function io($ej, $Ka) {

    $gd = $Ka;
    $as = $ej;

    return function() use (&$gd, &$as) {

        $cZ = $as;
        $K2 = $gd;
        $as = $K2;
        $cZ = $cZ ^ $cZ << 23;
        $cZ = $cZ ^ $cZ >> 17;
        $cZ = $cZ ^ $K2;
        $cZ = $cZ ^ $K2 >> 26;
        $gd = $cZ;

        return ($as + $gd) % 4294967296;
    };
}

$SI = [];
$NX = 0;
$pJ = io(612538604, $OG);

for (; $NX < 50;) {
        array_push($SI,  $pJ() & 255);
        $NX = $NX + 1;
}

  • Вопрос задан
  • 316 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Разная разрядность чисел при выполнении битовых операций.
JS: 612538604 << 23 === 1979711488
PHP: 612538604 << 23 === 5138346233823232
Лечится принудительным ограничением разрядности:
$cZ = $cZ ^ (($cZ << 23) & 0xFFFFFFFF);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы