3

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

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

编辑:

VB 中的代码 - 两个“AA”十六进制值具有代表性。

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

3 回答 3

4

通过 php.net查看此评论:

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

<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>
于 2012-09-11T11:51:33.257 回答
3

hexdec 手册页所述:

该函数现在可以将平台整数类型的值转换为大值,在这种情况下它将返回值作为浮点数。

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

例如,如果你查看 hexdec 手册页的注释,你会发现这个注释

如果您稍微调整该功能,以避免通知,您将获得:

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 文档上的用户注释有时是一个真正的金矿 ;-)

于 2012-09-11T11:40:08.020 回答
2

我一直在尝试为这个问题找到一个体面的答案,所以我编写了这个函数,它适用于十六进制字符串输入,返回一个带符号的十进制值。

public function hex_to_signed_int($hex_str){
    $dec = hexdec($hex_str);
    //test is value negative
    if($dec & pow(16,strlen($hex_str))/2 ){ return $dec-pow(16,strlen($hex_str));}
    return $dec;
}
于 2021-11-29T13:28:37.990 回答