hex — PHP преобразует большое десятичное число в шестнадцатеричное

Я извлекаю информацию из сертификата с помощью 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

2

Решение

Ваш SerialNumber является Math_BigInteger объект как var_dump показывает.
Использовать toHex метод для получения содержащегося числа в шестнадцатеричном формате.
Смотрите ссылку на Веб-сайт PEAR.

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

Замечания: 118045041395046077749311747456482878735 в десятичном формате равно 58CEA5E36351B91F49E47A20CEFF250F в шестнадцатеричном формате. Вы можете легко проверить это с помощью онлайн-конвертера, такого как этот.

4

Другие решения

Вот альтернативное решение для преобразования десятичного числа в шестнадцатеричный формат без использования внешних библиотек.

$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

Вы также можете использовать конкатенацию строк вместо массива prepend. Надеюсь это поможет. Спасибо!

0

По вопросам рекламы [email protected]