[英]How to convert a hexadecimal value into a signed integer in PHP?
我正在尝试将十六进制字符串转换为有符号整数。
我可以使用 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(“ FFFFFFFE”)返回4294967294,而不是-2。 要转换为带符号的32位整数,您可以执行以下操作:
<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>
如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文档的用户说明有时是真正的金矿;-)
我一直试图找到这个问题的体面答案,所以我编写了这个函数,它适用于十六进制字符串输入,返回一个有符号的十进制值。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.