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

PHP convert large Decimal number to Hexadecimal

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

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

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

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

118045041395046077749311747456482878735

这是我要执行查找的php:

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

我尝试进行了一些不同的转换,但 none 中的结果以预期的格式返回。

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

变量转储

    ["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

var_dump 所示,您的序列号是一个 Math_BigInteger 对象。 使用 toHex 方法以十六进制格式检索包含的数字。 请参阅 PEAR website.

上的参考资料
$serial = $cert['tbsCertificate']['serialNumber'];
$valueInHex = $serial->toHex();

注意:十进制格式的118045041395046077749311747456482878735等于十六进制格式的58CEA5E36351B91F49E47A20CEFF250F。您可以使用 this.

等在线转换器轻松检查

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

$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

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