Пакет php5 не работает на x84_64 env - PullRequest
4 голосов
/ 27 апреля 2011
   pack('H*', dechex(12345678900)) /* on 32bit */  
!= pack('H*', dechex(12345678900)) /* on 64bit */

почему?

1 Ответ

1 голос
/ 10 мая 2011

Я не знаю, как это исправить, но мне кажется, я знаю, почему это происходит. Никаких ошибок здесь - прямо из руководства http://php.net/manual/en/function.dechex.php

Наибольшее число, которое можно преобразовать, - это 4294967295 в десятичном виде, в результате чего получается "ffffffff"

Я не знаю, что именно происходит «внутри» php, но вы, вероятно, вызываете переполнение 32-битного целого без знака (12 345 678 900> 4 294 967 295). Поскольку в 64-разрядной системе этот предел должен составлять 18 446 744 073 709 551 615, dechex возвращает «правильные» значения (32-разрядная разница по сравнению с 64-разрядной не представляется документированной, и я могу ошибаться, поскольку у меня нет 64-разрядной системы для тестирования).

// Изменить:

В качестве последнего средства вы можете использовать расширение GMP , чтобы создать собственную функцию hecdex для 32-битной системы, но это приведет к огромным накладным расходам. Вероятно, это будет одна из самых медленных реализаций, известных современному программированию.

// Edit2:

Написал функцию, используя BCMath , я сейчас на Windows и изо всех сил пытался найти правильную dll для GMP.

function dechex32($i) {
    //Cast string
    $i = (string)$i;
    //Initialize result string
    $r = NULL;
    //Map hex values 0-9, a-f to array keys
    $hex = array_merge(range(0, 9), range('a', 'f'));
        //While input is lagrer than 0
        while(bccomp($i, '0') > 0) {
            //Modulo 16 and append hex char to result
            $r.= $hex[$mod = bcmod($i, '16')];
            //i = (i - mod) / 16
            $i = bcdiv(bcsub($i, $mod), '16');
        }
    //Reverse result and return
    return strrev($r);
}

var_dump(dechex32(12345678900));
/*string(9) "2dfdc1c34"*/

Тщательно не проверял, но, кажется, работает. Использование в качестве последнего средства - грубый тест с 100 000 итераций показал, что он примерно в 40 раз медленнее, чем собственная реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...