PHPのお勉強!

PHP TOP

dechex

(PHP 4, PHP 5, PHP 7, PHP 8)

dechex10 進数を 16 進数に変換する

説明

dechex(int $num): string

num で指定した符号なし整数値を 16 進数表現した文字列を返します。

変換できる最大の数字は、32 ビットプラットフォームの場合は PHP_INT_MAX * 2 + 1 (-1) です。これは 10 進数で表すと 4294967295 であり、 dechex() が返す結果は ffffffff になります。

パラメータ

num

変換したい 10 進数値。

PHP の int は符号付き整数ですが、 dechex() ではこれを符号なし整数として扱います。 つまり、負の整数を渡しても、それを符号なし整数として処理します。

戻り値

num を 16 進文字列で表した値を返します。

例1 dechex() の例

<?php
echo dechex(10) . "\n";
echo
dechex(47);
?>

上の例の出力は以下となります。

a
2f

例2 dechex() での大きな整数の例

<?php
// 以下の出力例は 32 ビットプラットフォームでのものです。
// すべての結果が同じになることに注目しましょう。
echo dechex(-1)."\n";
echo
dechex(PHP_INT_MAX * 2 + 1)."\n";
echo
dechex(pow(2, 32) - 1)."\n";
?>

上の例の出力は以下となります。

ffffffff
ffffffff
ffffffff

参考

  • hexdec() - 16 進数を 10 進数に変換する
  • decbin() - 10 進数を 2 進数に変換する
  • decoct() - 10 進数を 8 進数に変換する
  • base_convert() - 数値の基数を任意に変換する

add a note

User Contributed Notes 34 notes

up
87
brent
18 years ago
Be very careful calling dechex on a number if it's stored in a string.

For instance:

The max number it can handle is 4294967295 which in hex is FFFFFFFF, as it says in the documentation.

dechex(4294967295) => FFFFFFFF //CORRECT

BUT, if you call it on a string of a number, it casts to int, and automatically gives you the largest int it can handle.

dechex('4294967295') => 7FFFFFFF //WRONG!

so you'll need to cast to a float:

dechex((float) '4294967295') => FFFFFFFF //CORRECT

This took me FOREVER to figure out, so hopefully I just saved someone some time.
up
15
joost at bingopaleis dot com
22 years ago
Here are two functions that will convert large dec numbers to hex and vice versa. And I really mean LARGE, much larger than any function posted earlier.

<pre>
// Input: A decimal number as a String.
// Output: The equivalent hexadecimal number as a String.
function dec2hex($number)
{
$hexvalues = array('0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F');
$hexval = '';
while($number != '0')
{
$hexval = $hexvalues[bcmod($number,'16')].$hexval;
$number = bcdiv($number,'16',0);
}
return $hexval;
}

// Input: A hexadecimal number as a String.
// Output: The equivalent decimal number as a String.
function hex2dec($number)
{
$decvalues = array('0' => '0', '1' => '1', '2' => '2',
'3' => '3', '4' => '4', '5' => '5',
'6' => '6', '7' => '7', '8' => '8',
'9' => '9', 'A' => '10', 'B' => '11',
'C' => '12', 'D' => '13', 'E' => '14',
'F' => '15');
$decval = '0';
$number = strrev($number);
for($i = 0; $i < strlen($number); $i++)
{
$decval = bcadd(bcmul(bcpow('16',$i,0),$decvalues[$number{$i}]), $decval);
}
return $decval;
}
</pre>
up
8
jrisken at mn dot rr dot com
19 years ago
A less elegant but (perhaps) faster way to pad is with substr with a negative length argument. I use it in this tiny function which formats computed rgb color codes for style sheets:
<?
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}
?>
up
4
mina86 at tlen dot pl
20 years ago
Easiest :P way to create random hex color:

<?php
function rand_color() {
return
substr('00000' . dechex(mt_rand(0, 0xffffff)), -6);
}
?>
up
1
baoquyen804 at gmail dot com
10 years ago
this base function convert string rgb to color
<?php
function rgb_to_color($rgb, $symbols=' '){
$color = '';
$arr = explode($symbols, $rgb);
$count = count($arr);
for(
$i=0; $i<$count; $i++){
$color .= dechex($arr[$i]);
}
return
'#'.$color;
}
echo
rgb_to_color('186 186 18'); // #baba12
echo rgb_to_color('186-186-18', '-'); // #baba12
?>
up
4
Anonymous
20 years ago
If you need to generate random HEX-color, use this:
<?php
function random_hex_color(){
return
sprintf("%02X%02X%02X", mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
}
$hex = random_hex_color(); // 09B826
?>

Enjoy.
up
1
sneskid at hotmail dot com
12 years ago
If you want to create or parse signed Hex values:

<?php
// $d should be an int
function sdechex($d) { return ($d<0) ? ('-' . dechex(-$d)) : dechex($d); }

// $h should be a string
function shexdec($h) { return ($h[0] === '-') ? -('0x' . substr($h,1) + 0) : ('0x' . $h + 0); }

// test

$v = sdechex(-123); // string(3) "-7b"
$i = shexdec($v); // int(-123)
var_dump($v, $i);
?>

Also note that ('0x' . $str + 0) is faster than hexdec()
up
2
mountarreat at gmail dot com
16 years ago
I was challenged by a problem with large number calculations and conversion to hex within php. The calculation exceeded unsigned integer and even float range. You can easily change it for your needs but it is, thanks to bcmath, capable of handling big numbers via string. This function will convert them to hex.

In this specific example though, since I use it for game internals that can only handle 32 bit numbers, it will truncate calculations at 8 digits. If the input is 1 for example it will be filled up with zeros. Output 00000001h.

Of course I don't claim it to be a good one, but it works for me and my purpose. Suggestions on faster code welcome!

<?php
// Turns numbers into 32-bit hex string; Fills up zeros
function lrgDec2Hex($number)
{
$i = 0;
$hex = array();

while(
$i < 8) {
if(
$number == 0) {
array_push($hex, '0');
}
else {
array_push($hex, strtoupper(dechex(bcmod($number, '16'))));
$number = bcdiv($number, '16', 0);
}
$i++;
}
krsort($hex);
return
implode($hex);
}
?>
up
1
Mista-NiceGuy at web dot de
18 years ago
These are functions to convert roman numbers (e.g. MXC) into dec and vice versa.
Note: romdec() does not check whether a string is really roman or not. To force a user-input into a real roman number use decrom(romdec($input)). This will turn XXXX into XL for example.

<?php
function decrom($dec){
$digits=array(
1 => "I",
4 => "IV",
5 => "V",
9 => "IX",
10 => "X",
40 => "XL",
50 => "L",
90 => "XC",
100 => "C",
400 => "CD",
500 => "D",
900 => "CM",
1000 => "M"
);
krsort($digits);
$retval="";
foreach(
$digits as $key => $value){
while(
$dec>=$key){
$dec-=$key;
$retval.=$value;
}
}
return
$retval;
}

function
romdec($rom){
$digits=array(
"I" => 1,
"V" => 5,
"X" => 10,
"L" => 50,
"C" => 100,
"D" => 500,
"M" => 1000
);
$retval="";
$chars=array();
for(
$i=1;$i<=strlen($rom);$i++){
$chars[]=substr($rom,$i-1,1);
}
$step=1;
for(
$i=count($chars)-1;$i>=0;$i--){
if(!isset(
$digits[$chars[$i]])){ return "Error!"; }
if(
$step<=$digits[$chars[$i]]){
$step=$digits[$chars[$i]];
$retval+=$digits[$chars[$i]];
}
else{
$retval-=$digits[$chars[$i]];
}
}
return
$retval;
}

echo
decrom(romdec("XXXX"));
?>
up
4
admin AT bobfrank DOT org
19 years ago
Here is a very small zeropadding that you can use for numbers:

function zeropad($num, $lim)
{
return (strlen($num) >= $lim) ? $num : zeropad("0" . $num);
}

zeropad("234",6);

will produce:
000234

zeropad("234",1);

will produce:
234
up
2
monkyNOSPAM at phpfi dot org dot invalid
22 years ago
Here's how to use bitwise operations for RGB2hex conversion. This function returns hexadesimal rgb value just like one submitted by gurke@bigfoot.com above.

function hexColor($color) {
return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}

example:

$col[0] = 25;
$col[1] = 255;
$col[2] = 55;

print hexColor($col);
up
4
jbleau at gmail dot com
16 years ago
I was confused by dechex's size limitation. Here is my solution to the problem. It supports much bigger values, as well as signs.

<?php
function dec_to_hex($dec)
{
$sign = ""; // suppress errors
if( $dec < 0){ $sign = "-"; $dec = abs($dec); }

$hex = Array( 0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5,
6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 'a',
11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e',
15 => 'f' );

do
{
$h = $hex[($dec%16)] . $h;
$dec /= 16;
}
while(
$dec >= 1 );

return
$sign . $h;
}
?>
up
1
delchodimi at gmail dot com
9 years ago
I like the example with the bitwise operations but if the value of color[0] is less than 16 it's not accurate:
example:
color[0]: 0;
color[1]: 0;
color[2]: 255;
function hexColor($color) {
return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}
It returns "ff", which is not legit RGB color...
so my solution is to combine the function above with:
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}

If you gotta deal with array of rgb values this is my solution:
------------------------------------------------------
function hexColor($color) {
$rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
return("#".substr("000000".$rgb, -6));
}
------------------------------------------------------
up
2
huda m elmatsani <justhuda at netscape dot net>
21 years ago
Create Random Hex Color:

function make_seed() {
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((double) $usec * 100000);
}

function rand_hex() {
mt_srand(make_seed());
$randval = mt_rand(0,255);
//convert to hex
return sprintf("%02X",$randval);
}

function random_color(){
return "#".rand_hex().rand_hex().rand_hex();
}

hme ;)
up
3
andries at centim dot be
12 years ago
If you need to convert a large number (> PHP_MAX_INT) to a hex value, simply use base_convert. For example:

base_convert('2190964402', 10, 16); // 829776b2
up
1
hmlinks at gmail dot com
12 years ago
I wrote this to convert hex into signed int, hope this helps someone out there... peace :)

<?php
$hex
= dechex(-32767);
$dec = shexdex($hex);

function
shexdex($hex){
$dec = hexdec($hex);

// Negative number (in binary if the msb is 1 then it is neg)
// since one hex is 4bits, the value 8 and up contain msb of 1, hence negative number
if ($hex[0] >= '8'){ // Note: if you use the digit 8 it is not the same as '8'
$dec -= 1;
$dec = ~$dec;

return -
$dec;
}

return
$dec;
}

if (
$dec == -32767){
echo
'Yay!';
}
?>
up
1
sjaak at spoilerfreaks dot com
17 years ago
To force the correct usage of 32-bit unsigned integer in some functions, just add '+0' just before processing them.

for example
<?php echo(dechex("2724838310")); ?>
will print '7FFFFFFF'
but it should print 'A269BBA6'

When adding '+0' php will handle the 32bit unsigned integer
correctly
<?php echo(dechex("2724838310"+0)); ?>
will print 'A269BBA6'
up
1
allan-wegan at allan-wegan dot de
21 years ago
now, here is a nice and small function to convert integers to hex strings and it avoids use of the DECHEX funtion because that function changed it's behavior too often in the past (now, in PHP version 4.3.2 it works with numbers bigger than 0x7FFFFFFF correctly, but i need to be backward compatible).

function &formatIntegerForOutput($value) {
$text = "00000000";
$transString = "0123456789ABCDEF";
// handle highest nibble (nibble 7):
$nibble = $value & 0x70000000;
$nibble >>= 28;
if ($value < 0) {
$nibble = $nibble | 0x00000008;
}
$text[0] = $transString[$nibble];
$value &= 0x0FFFFFFF;
// nibbles 0 to 6:
for ($a = 7; $a > 0; $a --) {
$nibble = $value & 0x0000000F;
$text[$a] = $transString[$nibble];
$value >>= 4;
}
return $text
}

this function should be not too slow and is really simple.
I don't know, if the DECHEX function in the future will pad it's output to ever be 8 characters in length - so for backward compatibility reasons even in future PHP versions i avoided to use it.
up
1
Anonymous
20 years ago
If you need to convert RGB-color into HEX-color, use this:
<?php
function rgb2hex($rgb){
return
sprintf("%06X", $rgb);
}
$hex = rgb2hex(65280); // 00FF00
?>
up