如何在PHP中将十六进制值转换为有符号整数?

时间:2012-09-11 11:34:56

标签: php hex

我正在尝试将十六进制字符串转换为有符号整数。

我可以使用hexdec()轻松将其转换为无符号值,但这不会给出有符号值。

编辑:

VB中的

代码 - 两个“AA”十六进制值是代表性的。

Dim bs(2) As Byte
bs(1) = "AA"
bs(2) = "AA"
Dim s As Short
s = BitConverter.ToInt16(bs, 1)

2 个答案:

答案 0 :(得分:3)

通过php.net查看此comment

  

hexdec()返回无符号整数。例如,hexdec(“FFFFFFFE”)返回4294967294,而不是-2。要转换为带符号的32位整数,您可以执行以下操作:

<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>

答案 1 :(得分:2)

正如hexdec manual page所说:

  

该功能现在可以转换值   这对平台来说很重要   整数类型,它将返回值   在那种情况下反而浮动。

如果你想获得某种大整数(不是浮点数),你需要将它存储在一个字符串中...这可能是使用BC Math函数。

例如,如果你查看hexdec手册页的评论,你会发现this note

如果你稍微调整一下这个功能,为了避免通知,你会得到:

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

(此功能已从我链接到的备注中复制;并且只有一点适合我)

在你的号码上使用它:

$h = 'D5CE3E462533364B';
$f = bchexdec($h);
var_dump($f);

输出将是:

string '15406319846273791563' (length=20)

所以,不是那种大浮子;你似乎对你的期望似乎很好:

  

来自calc.exe =的结果   15406319846273791563


希望这有帮助;-)
而且,是的,有关PHP文档的用户注释有时是真正的金矿; - )