Мне нужно преобразовать шестнадцатеричную строку в int64 в PHP, и он должен использовать последний бит в качестве знака вместо достижения максимума. Например:
$hex = "eb3dd796efda2409"
и мне нужен конечный результат, чтобы быть
-1495802457948019703
Я достигаю этого результата на других языках (python / go), конвертируя hex в uint64 и обратно в int64. Я знаю, что PHP не может делать unsigned 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. Он просто напечатает максимальный размер вместо того, чтобы упасть до отрицательного значения. есть идеи как это сделать?
Наконец-то удалось решить проблему
unpack("J",hex2bin("eb3dd796efda2409"));
кажется, hex2bin испортил порядок байтов, поэтому, когда мы попытались сделать J, он решает правильно
Спасибо за помощь!
Других решений пока нет …