dechex

(PHP 4, PHP 5, PHP 7)

dechex十进制转换为十六进制

说明

string dechex ( int $number )

返回一字符串,包含有给定 number 参数的十六进制表示。

所能转换的最大数值为十进制的 PHP_INT_MAX * 2 + 1 (或 -1):在 32 位平台上是十进制的 4294967295,其 dechex() 的结果为 ffffffff

参数

number

要转换的十进制值

PHP 的 integer 类型是有符号的,但 dechex() 处理无符号整数,负正数会以无符号处理。

返回值

number 的16进制表示

范例

Example #1 dechex() 例子

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

以上例程会输出:

a
2f

Example #2 大整数的 dechex() 例子

<?php
// The output below assumes a 32-bit platform.
// Note that the output is the same for all values.
echo dechex(-1)."\n";
echo 
dechex(PHP_INT_MAX 1)."\n";
echo 
dechex(pow(232) - 1)."\n";
?>

以上例程会输出:

ffffffff
ffffffff
ffffffff

参见

User Contributed Notes

hugo 25-Apr-2017 02:12
warning jbleau dec_to_hex method is buggy, avoid it.

dec_to_hex('9900000397')-->24e16048f
dec_to_hex('9900000398')-->24e16048f
dec_to_hex('9900000399')-->24e16048f
delchodimi at gmail dot com 30-Apr-2015 11:43
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));
}
------------------------------------------------------
baoquyen804 at gmail dot com 02-Sep-2014 06:16
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
?>
jenny-schubert87 dot 1 at web dot de 01-Aug-2014 07:02
I figured out another way to do this:
if you have a very long decimal number in gmp format (you can always create a gmp number with gmp_init($numberstring), you can simply do gmp_strval($gmpnumber, 16), where $gmpnumber is your gmp number, and the 16 is the base you want to transform it to. Worked for me like a charm, also works for other bases.
Kory P. 11-Nov-2013 12:56
Or you could use this for an RGBA color.
    function toAlphaColor($n,$a)
    {
        $rgb = substr("000000".dechex($n),-6);
        $alpha = substr("00".dechex($a),-2);
        return("#".$rgb.$alpha);
    }
mailderemi at gmail dot com 13-Dec-2012 11:26
Javascript Crypt:

<?php
function jsCrypt($script,$level=1){
    for (
$j=0;$j<$level;$j++){
       
$asc='';
        for (
$i=0;$i<strlen($script);$i++)
           
$asc.='%'.dechex(ord($script[$i]));
       
$script='<SCRIPT LANGUAGE="JavaScript">document.write(unescape(\''.$asc.'\'));</SCRIPT>';
    }
    return
$script;
}

echo
jsCrypt('<script>alert(123);</script>',1);
?>
hmlinks at gmail dot com 03-Oct-2012 10:02
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!';
}
?>
sneskid at hotmail dot com 23-Mar-2012 04:09
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()
andries at centim dot be 07-Mar-2012 11:44
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
9381904 at gmail dot com 02-Nov-2011 07:11
for mac address
<?php
function dec2mac($mac) {
  
$mac=preg_split("([.])", $mac, 6);
  
$hexmac="";
   foreach (
$mac as $part)
   {
  
$part=dechex($part);
  
strlen($part)<2 ? $hexmac.="0$part" : $hexmac.=$part;
   }
   return
$hexmac;
}
echo
dec2mac("0.29.96.71.60.137"); // 001d60473c89
?>
jbleau at gmail dot com 29-Oct-2008 11:23
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;
}
?>
mountarreat at gmail dot com 11-May-2008 06:55
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);
}
?>
sjaak at spoilerfreaks dot com 09-Mar-2007 04:28
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'
brent 16-Dec-2006 08:33
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.
Mista-NiceGuy at web dot de 28-Dec-2005 02:00
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"));
?>
cory at lavacube dot com 28-Oct-2005 01:45
A handy little function to convert HEX colour codes to "web safe" colours...

<?php

function color_mkwebsafe ( $in )
{
   
// put values into an easy-to-use array
   
$vals['r'] = hexdec( substr($in, 0, 2) );
   
$vals['g'] = hexdec( substr($in, 2, 2) );
   
$vals['b'] = hexdec( substr($in, 4, 2) );

   
// loop through
   
foreach( $vals as $val )
    {
       
// convert value
       
$val = ( round($val/51) * 51 );
       
// convert to HEX
       
$out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
    }

    return
$out;
}

?>

Example: color_mkwebsafe('0e5c94');
Produces: 006699

Hope this helps someone out... Happy coding. :-)
oliver at realtsp dot com 14-Jun-2005 10:46
Warning for use on 64 bit machines! The Extra length matters!

32bit machine:
php -r 'echo dechex(4294967295);'
output: ffffffff

64bit machine:
php -r 'echo dechex(4294967295);'
output: ffffffff

so far it is ok. But for slightly bigger numbers:

32bit machine:
php -r 'echo dechex(4294967296);'
output: 0

64bit machine:
php -r 'echo dechex(4294967296);'
output: 100000000

note the difference!

This is particularly important when converting negative numbers:

64bit machine:
php -r 'echo dechex(-1);'
output: ffffffffffffffff

32bit machine:
php -r 'echo dechex(-1);'
output: ffffffff

If you want your code to be portable to amd64 or xeons (which are now quite popular with hosting companies) then you must ensure that your code copes with the different length of the result for negative numbers (and the max value, although that is probably less critical).
jrisken at mn dot rr dot com 29-May-2005 04:33
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));
}
?>
admin AT bobfrank DOT org 02-May-2005 04:28
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
morten at nilsen dot com 02-Jan-2005 01:30
I see a lot of less-than-optimal functions posted on this page, so I feel I have to give some better examples...
due to the sheer size of this collection, I have made it available on my server, rather than copy/paste it into these comments.

http://ryo-ohki.4th-age.com/demos/able.php
and
http://ryo-ohki.4th-age.com/demos/able.phps

dechex replacement function from above source:
<?php
  define
('BIT_BYTE', 8); // bits per byte
 
define('HEX_BYTE', BIT_BYTE/4); // hex digits in a byte

 
define('BIT_INT'32); // sizeof(int)
 
define('HEX_INT'BIT_INT / (BIT_BYTE/HEX_BYTE)); // hex digits in an int

 
function i2h($int, $group=HEX_BYTE, $size=HEX_INT, $sep=' ') {
   
$ret = '';
    while(
$size--) {
     
$n=($int>>($size*4)) & 0xf;
     
$ret .= $n>9?chr(55 + $n):$n;
      if(
$size && $size%$group == 0) $ret .= $sep;
    }
    return
$ret;
  }

  echo
i2h(rand(1,2)==1?-mt_rand():mt_rand());
?>
wangster at darkcore dot net 15-Dec-2004 08:36
This function will take a string and convert it into a hexdump.

e.g.

3c666f6e 74207369 7a653d22 33223e4c  <font.size."3">L
6561726e 20686f77 20746f20 62652061  earn.how.to.be.a

function hexdump($string) {
   $hex="";
   $substr = "";
   for ($i=0; $i < strlen($string) ;$i++) {
     if(!($i % 4) && $i != 0) {
       $hex .= " ";
     }
     if(!($i % 16) && $i != 0) {
       $clean = preg_replace("/[^a-zA-Z0-9!-.<>\/]/",".",$substr);
       $hex .= " ".htmlentities($clean)."\n";
       $substr = "";
     }
     $substr .=  $string[$i];
     $hex .= dechex(ord($string[$i]));
   }
   return $hex;
}
12-Dec-2004 04:31
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.
11-Dec-2004 10:30
If you need to convert RGB-color into HEX-color, use this:
<?php
function rgb2hex($rgb){
    return
sprintf("%06X", $rgb);
}
$hex = rgb2hex(65280); // 00FF00
?>
admin[TAKETHISOUT] at torsoft dot no-ip dot com 21-Apr-2004 09:01
<?php
/*
here are two functions, some might find them useful (maybe for encoding)
converting string to hex and hex to string:
*/

function strhex($string)
{
   
$hex="";
    for (
$i=0;$i<strlen($string);$i++)
       
$hex.=(strlen(dechex(ord($string[$i])))<2)? "0".dechex(ord($string[$i])): dechex(ord($string[$i]));
    return
$hex;
}
function
hexstr($hex)
{
   
$string="";
    for (
$i=0;$i<strlen($hex)-1;$i+=2)
       
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
    return
$string;
}
?>
daevid at daevid dot com 18-Mar-2004 11:59
Here's my version of a red->yellow->green gradient:

<?php
function colorMeter($percent, $invert = false)
{
   
//$percent is in the range 0.0 <= percent <= 1.0
    //    integers are assumed to be 0% - 100%
             // and are converted to a float 0.0 - 1.0
    //     0.0 = red, 0.5 = yellow, 1.0 = green
    //$invert will make the color scale reversed
    //     0.0 = green, 0.5 = yellow, 1.0 = red
   
    //convert (int)% values to (float)
   
if (is_int($percent)) $percent = $percent * 0.01;
   
   
$R = min((2.0 * (1.0-$percent)), 1.0) * 255.0;
   
$G = min((2.0 * $percent), 1.0) * 255.0;
   
$B = 0.0;
   
    return ((
$invert) ?
sprintf("%02X%02X%02X",$G,$R,$B)
:
sprintf("%02X%02X%02X",$R,$G,$B));
}
//colorMeter
?>

and use it like this:

<TABLE BORDER=1 WIDTH="300">
<?php
for ($i = 0.0; $i <= 1.0; $i += 0.10)
{
   
$RGB = colorMeter($i);
    print
"<TR><TD BGCOLOR='".$RGB."'>".$i."</TD><TD>
<PRE>"
.$RGB."</PRE></TD></TR>\n";
}
?>
</TABLE>

<P>

<TABLE BORDER=1 WIDTH="300">
<?php
for ($i = 0; $i <= 100; $i += 10)
{
   
$RGB = colorMeter(intval($i), true);
    print
"<TR><TD BGCOLOR='".$RGB."'>".$i."</TD><TD>
<PRE>"
.$RGB."</PRE></TD></TR>\n";
}
?>
</TABLE>
thr at recide dot net 10-Feb-2004 01:39
/*
* RGB-Colorcodes(i.e: 255 0 255) to HEX-Colorcodes (i.e: FF00FF)
*/
function rgb2hex($rgb){
    if(!is_array($rgb) || count($rgb) != 3){
        echo "Argument must be an array with 3 integer elements";
        return false;
    }
    for($i=0;$i<count($rgb);$i++){
        if(strlen($hex[$i] = dechex($rgb[$i])) == 1){
            $hex[$i] = "0".$hex[$i];
        }
    }
    return $hex;
}
/* Example */
print_r(rgb2hex(array(10,255,255)));
mina86 at tlen dot pl 05-Feb-2004 06:05
Easiest :P way to create random hex color:

<?php
function rand_color() {
    return
substr('00000' . dechex(mt_rand(0, 0xffffff)), -6);
}
?>
huda m elmatsani <justhuda at netscape dot net> 17-Sep-2003 12:36
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 ;)
allan-wegan at allan-wegan dot de 19-Jul-2003 07:53
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.
monkyNOSPAM at phpfi dot org dot invalid 24-Sep-2002 04:20
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);
joost at bingopaleis dot com 28-Apr-2002 06:21
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>
jfren484 at hotmail dot com 13-Feb-2002 12:47
Here's a function which works for decimal values up to 9007199254740992 (hex 20000000000000).

function dec2hex($dec)
{
  $hex = ($dec == 0 ? '0' : '');

  while ($dec > 0)
  {
    $hex = dechex($dec - floor($dec / 16) * 16) . $hex;
    $dec = floor($dec / 16);
  }

  return $hex;
}
kristoffer at caveo dot se 11-Feb-2002 02:39
Heres a example of dec to html hex gradient. Have fun :)

//Amount of gradients
$l = 20;

//Start color
$start[0] = "255";     //red
$start[1] = "0";     //green
$start[2] = "255";     //blue

//End color
$end[0] = "255";     //red
$end[1] = "255";    //green
$end[2] = "255";    //blue

for ($t = 1; $t < $l;) {

    $x = $x * $t;

    for ($i = 0; $i < 3;) {

        $buffer[$i] = $start[$i] - $end[$i];
        $buffer[$i] = floor($buffer[$i] / $l);
        $rgb[$i] = $start[$i] - ($buffer[$i] * $t);

        if ($rgb[$i] > 255) {

            $rgb[$i] = 255;

        }

        $rgb[$i] = dechex($rgb[$i]);
        $rgb[$i] = strtoupper($rgb[$i]);

        if (strlen($rgb[$i]) < 2) {

            $rgb[$i] = "0$rgb[$i]";

        }

        $i++;

    }

    $color = "$rgb[0]$rgb[1]$rgb[2]";
    echo "$color";
        $t++;

}

?>