PHP将大十进制数转换为十六进制数

时间:2015-04-18 15:17:08

标签: php hex decimal bigdecimal phpseclib

我正在使用php从证书中提取信息,虽然数据可以正常返回,但有一个特定值“SerialNumber”正在以不同的数字格式返回,不确定它是什么..

例如,我期望收到的实际格式是:

  

58 ce a5 e3 63 51 b9 1f 49 e4 7a 20 ce ff 25 0f

然而,我实际上得到的是:

  

118045041395046077749311747456482878735

这是我执行查找的php:

$serial = $cert['tbsCertificate']['serialNumber'];

我尝试过几次不同的转换,但没有一次以预期的格式返回。

典型证书序列号字段的示例..

enter image description here

VAR DUMP

    ["version"]=>
    string(2) "v3"
    ["serialNumber"]=>
    object(Math_BigInteger)#5 (6) {
      ["value"]=>
      string(39) "118045041395046077749311747456482878735"
      ["is_negative"]=>
      bool(false)
      ["generator"]=>
      string(7) "mt_rand"
      ["precision"]=>
      int(-1)
      ["bitmask"]=>
      bool(false)
      ["hex"]=>
      NULL

2 个答案:

答案 0 :(得分:4)

您的SerialNumber是var_dump对象,toHex显示。 使用$serial = $cert['tbsCertificate']['serialNumber']; $valueInHex = $serial->toHex(); 方法以十六进制格式检索包含的数字。 请参阅Math_BigInteger上的参考资料。

{{1}}

注意:十进制格式的 118045041395046077749311747456482878735 等于十六进制格式的 58CEA5E36351B91F49E47A20CEFF250F 。您可以使用PEAR website等在线转换器轻松检查。

答案 1 :(得分:0)

以下是将十进制数转换为十六进制格式而不使用外部库的替代解决方案。

$dec = '118045041395046077749311747456482878735';
// init hex array
$hex = array();

while ($dec) {
    // get modulus // based on docs both params are string
    $modulus = bcmod($dec, '16');
    // convert to hex and prepend to array
    array_unshift($hex, dechex($modulus));
    // update decimal number
    $dec = bcdiv(bcsub($dec, $modulus), 16);
}

// array elements to string
echo implode('', $hex);

代码的输出...... Online Demo

  

58cea5e36351b91f49e47a20ceff250f

您也可以使用字符串连接而不是数组前置。希望这可以帮助。谢谢!