PHP - преобразование шестнадцатеричной строки в uint64 и в int64

Мне нужно преобразовать шестнадцатеричную строку в int64 в PHP, и она должна использовать последний бит в качестве знака вместо достижения максимального значения. Например:

$hex = "eb3dd796efda2409"

и мне нужно, чтобы конечный результат был

-1495802457948019703

Я достигаю этого результата на других языках (python/go), преобразовывая шестнадцатеричный код в uint64 и обратно в int64. Я знаю, что PHP не может явно использовать int64 без знака.

Я нашел эту функцию, используя bcmath, которая правильно преобразует шестнадцатеричный код в строку uint64.

 function bchexdec($hex)
 {
     $dec = 0;
     $len = strlen($hex);
     for ($i = 1; $i <= $len; $i++)
         $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));

     return $dec;
 }

Но я не могу преобразовать строку uint64 в int64. Он просто напечатает максимальный размер вместо того, чтобы упасть до отрицательного значения. есть идеи как это сделать?


person Reynaldi Wijaya    schedule 15.03.2018    source источник
comment
Сначала вы должны проверить бит знака (старший бит). Если число положительное, преобразуйте его с помощью приведенной выше функции. Если оно отрицательное, выполните дополнение до 2, то есть инвертируйте число ( побитовое), вычислите его значение, затем добавьте 1.   -  person Aziz    schedule 15.03.2018


Ответы (1)


Наконец удалось решить проблему

unpack("J",hex2bin("eb3dd796efda2409"));

Кажется, hex2bin перепутал порядок следования байтов, поэтому, когда мы попытались выполнить J, он разрешился правильно. Спасибо за помощь!

person Reynaldi Wijaya    schedule 15.03.2018