簡體   English   中英

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'];

我嘗試進行一些不同的轉換,但沒有一個以預期的格式返回。

典型的證書序列號字段的樣本。

在此處輸入圖片說明

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

正如var_dump所示,您的SerialNumber是Math_BigInteger對象。 使用toHex方法以十六進制格式檢索包含的數字。 請參閱PEAR網站上的參考。

$serial = $cert['tbsCertificate']['serialNumber'];
$valueInHex = $serial->toHex();

:118045041395046077749311747456482878735以十進制格式等於58CEA5E36351B91F49E47A20CEFF250F十六進制格式。 您可以輕松地檢查與像一個在線轉換器

這是在不使用外部庫的情況下將十進制數轉換為十六進制格式的替代解決方案。

$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);

以及代碼的輸出... 在線演示

58cea5e36351b91f49e47a20ceff250f

您也可以使用字符串連接代替數組前綴。 希望這可以幫助。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM