我正在尝试将十六进制字符串转换为带符号整数。
我可以用hexdec()轻松地将其转换为无符号值,但这不会给出有符号值。
编辑:
VB中的代码-两个"AA"十六进制值具有代表性。
Dim bs(2) As Byte
bs(1) = "AA"
bs(2) = "AA"
Dim s As Short
s = BitConverter.ToInt16(bs, 1)
通过php.net查看此评论:
hexdec()返回无符号整数。例如,hexdec("FFFFFFF E")返回4294967294,而不是-2。要转换为有符号的32位整数,您可以执行以下操作:
<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>
如hexdec手册页面所述:
该函数现在可以转换值对平台来说太大了integer类型,它将返回值在这种情况下为float。
如果你想得到某种大整数(不是浮点),你需要把它存储在一个字符串中。。。这可能是使用BC数学函数实现的。
例如,如果你查看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文档上的用户注释有时是一座真正的金矿;-)
我一直在努力找到这个问题的正确答案,所以我编写了这个函数,它适用于十六进制字符串输入,返回一个带符号的十进制值。
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;
}