How to convert a huge integer to hex in php?

How can I convert this:

9312660682897061594767289296453011313180604726492752614962349778735928598708212386406555876878916185094145420038141655929349984786756296776268556142401047 

in base 16?

I found this recursive function:

 function bcdechex($dec) { $last = bcmod($dec, 16); $remain = bcdiv(bcsub($dec, $last), 16); if($remain == 0) { return dechex($last); } else { return bcdechex($remain).dechex($last); } } 

but a nesting level of 100 is reached even if I have xdebug.max_nesting_level = 1000 in my php.ini configuration file.

My xdebug configuration is as follows:

 ;Xdebug zend_extension = "${path}\php\php546x121216181946\php_xdebug-2.2.1-5.4-vc9.dll" xdebug.default_enable=1 xdebug.remote_enable=1 xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_autostart = false xdebug.dump_globals=1 xdebug.dump=COOKIE,FILES,GET,POST,REQUEST,SERVER,SESSION xdebug.dump.SERVER=REMOTE_ADDR,REQUEST_METHOD,REQUEST_URI xdebug.show_local_vars=1 xdebug.show_mem_delta=1 xdebug.collect_includes=1 xdebug.collect_vars=1 xdebug.collect_params=4 xdebug.collect_return=1 xdebug.auto_trace=0 xdebug.trace_options=0 xdebug.trace_format=0 xdebug.trace_output_dir="${path}\xdebug\trace" xdebug.trace_output_name="trace.%t" xdebug.profiler_enable=0 xdebug.profiler_append=1 xdebug.profiler_enable_trigger=1 xdebug.profiler_output_dir="${path}\xdebug\profiler" xdebug.profiler_output_name="cachegrind.out.%s.%t" xdebug.max_nesting_level = 1000 ;/Xdebug 

Does anyone have a different function than this or any hint of how I can convert this integer?

You know!

+8
decimal php hex
source share
2 answers

It is very easy to change a function that you consider iterative rather than recursive:

 function bcdechex($dec) { $hex = ''; do { $last = bcmod($dec, 16); $hex = dechex($last).$hex; $dec = bcdiv(bcsub($dec, $last), 16); } while($dec>0); return $hex; } 

Your example is $bignum converted to hex: b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dacb23d64755e823f35411f9e14c5617

+8
source share

The first answer is excellent (this allowed us to compare the results), but I cannot install BCMath. So, I found this function:

 function my_base_convert($numstring, $frombase, $tobase) { $chars = "0123456789abcdefghijklmnopqrstuvwxyz"; $tostring = substr($chars, 0, $tobase); $length = strlen($numstring); $result = ''; for ($i = 0; $i < $length; $i++) { $number[$i] = strpos($chars, $numstring{$i}); } do { $divide = 0; $newlen = 0; for ($i = 0; $i < $length; $i++) { $divide = $divide * $frombase + $number[$i]; if ($divide >= $tobase) { $number[$newlen++] = (int)($divide / $tobase); $divide = $divide % $tobase; } elseif ($newlen > 0) { $number[$newlen++] = 0; } } $length = $newlen; $result = $tostring{$divide} . $result; } while ($newlen != 0); return $result; } echo my_base_convert($bignum, 10, 16); 

Your example $ bignum converted to hex is the same as in the first answer: b1cf5653e79bef001acfb0f99d1f34487d16a8253e3a9971e98d46382114e8ac81b5102ab3c56be1f77d0eb754f566c0dace2323646423236464

The function is found here https://magp.ie/2015/09/30/convert-large-integer-to-hexadecimal-without-php-math-extension/ (But in the example there is a small error: "16, 10" instead of " 10, 16 ")

0
source share

All Articles