繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM