略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: hexdec

2024-11-15

hexdec

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

hexdec十六进制转换为十进制

说明

hexdec(string $hex_string): number

返回与 hex_string 参数所表示的十六进制数等值的的十进制数。hexdec() 将一个十六进制字符串转换为十进制数。

hexdec() 会忽略它遇到的任意非十六进制的字符。

参数

hex_string

要转换的十六进制的字符串

返回值

hex_string 十进制的表示

更新日志

版本 说明
4.1.0 PHP 4.1.0 开始,该函数可以处理 integer 大数字,这种情况下,它会返回 float 类型。

范例

示例 #1 hexdec() 例子

<?php
var_dump
(hexdec("See"));
var_dump(hexdec("ee"));
// both print "int(238)"

var_dump(hexdec("that")); // print "int(10)"
var_dump(hexdec("a0")); // print "int(160)"
?>

参见

add a noteadd a note

User Contributed Notes 31 notes

up
26
hafees at msn dot com
11 years ago
Use this function to convert a hexa decimal color code to its RGB equivalent. Unlike many other functions provided here, it will work correctly with hex color short hand notation.

Also, if a proper hexa decimal color value is given (6 digits), it uses bit wise operations for faster results.

For eg: #FFF and #FFFFFF will produce the same result

<?php
/**
* Convert a hexa decimal color code to its RGB equivalent
*
* @param string $hexStr (hexadecimal color value)
* @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
* @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)
* @return array or string (depending on second parameter. Returns False if invalid hex color value)
*/                                                                                                
function hex2RGB($hexStr, $returnAsString = false, $seperator = ',') {
   
$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
   
$rgbArray = array();
    if (
strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
       
$colorVal = hexdec($hexStr);
       
$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
       
$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
       
$rgbArray['blue'] = 0xFF & $colorVal;
    } elseif (
strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
       
$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
       
$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
       
$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
    } else {
        return
false; //Invalid hex color code
   
}
    return
$returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
} ?>

OUTPUT:

hex2RGB("#FF0") -> array( red =>255, green => 255, blue => 0)
hex2RGB("#FFFF00) -> Same as above
hex2RGB("#FF0", true) -> 255,255,0
hex2RGB("#FF0", true, ":") -> 255:255:0
up
2
programacion at mundosica dot com
10 years ago
Here is other function to transform a MAC Address to decimal:

<?php
function get_mac_decimal($mac) {
   
$clear_mac = preg_replace('/[^0-9A-F]/i','',$mac);
   
$mac_decimal = array();
    for (
$i = 0; $i < strlen($clear_mac); $i += 2 ):
       
$mac_decimal[] = hexdec(substr($clear_mac, $i, 2));
    endfor;
    return
implode('.',$mac_decimal);
}
?>
up
4
flurinj at gmx dot net
12 years ago
Here My version of converting a hex string to a signed decimal value:

<?php

function hexdecs($hex)
{
   
// ignore non hex characters
   
$hex = preg_replace('/[^0-9A-Fa-f]/', '', $hex);
   
   
// converted decimal value:
   
$dec = hexdec($hex);
   
   
// maximum decimal value based on length of hex + 1:
    //   number of bits in hex number is 8 bits for each 2 hex -> max = 2^n
    //   use 'pow(2,n)' since '1 << n' is only for integers and therefore limited to integer size.
   
$max = pow(2, 4 * (strlen($hex) + (strlen($hex) % 2)));
   
   
// complement = maximum - converted hex:
   
$_dec = $max - $dec;
   
   
// if dec value is larger than its complement we have a negative value (first bit is set)
   
return $dec > $_dec ? -$_dec : $dec;
}

?>
up
1
brian at sagesport dot com
17 years ago
The issue I've seen with the existing hex to dec conversion routines is the lack of error-trapping.  I stick to the theory that one should try to cover ALL the bases when writing a generalized routine such as this one.  I have a varied background that covers a wide variety of design/development languages, on the web as well as desktop apps.  As such I've seen multiple formats for writing hex colors.

For example, the color red COULD be written as follows:
#ff0000
&Hff0000
#ff
&Hff

Therefore I have written a function that is case-insensitive and takes into account the chance that different developers have a tendency to format hex colors in different ways.

<?php
 
function convert_color($hex){
   
$len = strlen($hex);
   
$chars = array("#","&","H","h");
   
$hex = strip_chars($hex, $chars);
   
preg_match("/([0-9]|[A-F]|[a-f]){".$len."}/i",$hex,$arr);
   
$hex = $arr[0];
    if (
$hex) {
      switch(
$len) {
        case
2:
         
$red = hexdec($hex);
         
$green = 0;
         
$blue = 0;
          break;
        case
4:
         
$red = hexdec(substr($hex,0,2));
         
$green=hexdec(substr($hex,2,2));
         
$blue = 0;
          break;
        case
6:
         
$red = hexdec(substr($hex,0,2));
         
$green=hexdec(substr($hex,2,2));
         
$blue = hexdec(substr($hex,4,2));
          break;      
      };
     
$color[success] = true;
     
$color[r] = $red;
     
$color[g] = $green;
     
$color[b] = $blue;
      return
$color;
    } else {
     
$color[success] = false;
     
$color[error] = "unable to convert hex to dec";
    };
  }

  function
strip_chars($string, $char){
   
$len = strlen($string);
   
$count = count($char);
    if (
$count >= 2) {
      for (
$i=0;$i<=$count;$i++) {
        if (
$char[$i]) {
         
$found = stristr($string,$char[$i]);
          if (
$found) {
           
$val = substr($string,$found+1,$len-1);
           
$string = $val;
          };
        };
      };
    } else {
     
$found = stristr($string,$char);
      if (
$found) {
       
$val = substr($string,$found+1,$len-1);
      };
    };
    echo
$val;
    return
$val;
  }

 
/*
    To use simply use the following function call:
      $color = convert_color("#FF");
      this will return the following assoc array if successful:
      *[success] = true
      *[r] = 255
      *[g] = 0
      *[b] = 0

      or copy and paste the following code:
     
      $hex = "FFFFFF"; // Color White
      $color = convert_color($hex);
      var_dump($color);
*/
?>

As you can see, the function "convert_color" accepts a hex # in most acceptable formats and returns an associative array.  [success] is set to TRUE if the function succeeds and FALSE if not.  The array members [r], [g] and [b] hold the red,green and blue values respectively.  If it fails, [error] holds a custom error message.

"strip_chars" is a support function written to remove the unwanted characters from the hex string, and sends the concatenated string back to the calling function.  It will accept either a single value or an array of values for the characters to remove.
up
4
chuckySTAR
13 years ago
Here's my hexdec function for greater numbers using BC Math

<?php
function bchexdec($hex)
{
   
$len = strlen($hex);
    for (
$i = 1; $i <= $len; $i++)
       
$dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
   
    return
$dec;
}

echo
bchexdec('ffffffffffffffffffffffffffffffff') . "\n" . (pow(2, 128));
?>
up
3
k10206 at naver dot com
14 years ago
<?
function hexrgb($hexstr) {
    $int = hexdec($hexstr);

    return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
?>
up
2
Halit YEL - halityesil at globya dot net
12 years ago
RGB to Hex
Hex to RGB
Function

<?PHP

function rgb2hex2rgb($c){
   if(!
$c) return false;
  
$c = trim($c);
  
$out = false;
  if(
preg_match("/^[0-9ABCDEFabcdef\#]+$/i", $c)){
     
$c = str_replace('#','', $c);
     
$l = strlen($c) == 3 ? 1 : (strlen($c) == 6 ? 2 : false);

      if(
$l){
         unset(
$out);
        
$out[0] = $out['r'] = $out['red'] = hexdec(substr($c, 0,1*$l));
        
$out[1] = $out['g'] = $out['green'] = hexdec(substr($c, 1*$l,1*$l));
        
$out[2] = $out['b'] = $out['blue'] = hexdec(substr($c, 2*$l,1*$l));
      }else
$out = false;
             
   }elseif (
preg_match("/^[0-9]+(,| |.)+[0-9]+(,| |.)+[0-9]+$/i", $c)){
     
$spr = str_replace(array(',',' ','.'), ':', $c);
     
$e = explode(":", $spr);
      if(
count($e) != 3) return false;
        
$out = '#';
         for(
$i = 0; $i<3; $i++)
           
$e[$i] = dechex(($e[$i] <= 0)?0:(($e[$i] >= 255)?255:$e[$i]));
             
         for(
$i = 0; $i<3; $i++)
           
$out .= ((strlen($e[$i]) < 2)?'0':'').$e[$i];
                 
        
$out = strtoupper($out);
   }else
$out = false;
         
   return
$out;
}

?>

Output

#FFFFFF =>
Array{
   red=>255,
   green=>255,
   blue=>255,
   r=>255,
   g=>255,
   b=>255,
   0=>255,
   1=>255,
   2=>255
}


#FFCCEE =>
Array{
   red=>255,
   green=>204,
   blue=>238,
   r=>255,
   g=>204,
   b=>238,
   0=>255,
   1=>204,
   2=>238
}
CC22FF =>
Array{
   red=>204,
   green=>34,
   blue=>255,
   r=>204,
   g=>34,
   b=>255,
   0=>204,
   1=>34,
   2=>255
}

0 65 255 => #0041FF
255.150.3 => #FF9603
100,100,250 => #6464FA


[EDIT BY danbrown AT php DOT net - Contains multiple bugfixes by (ajim1417 AT gmail DOT com) on 27-JAN-2010: Replaces typo in explode() and updates eregi() calls to preg_match().]
up
2
Anonymous
17 years ago
I wondered long time what is the best way to generate RGB-color from HEX-color, and just now i found the simpliest way!

<?php
$hex
= "FF00FF";
$rgb = hexdec($hex); // 16711935
?>

I hope this will save your time! :)
up
1
Walter Wlodarski
14 years ago
One of my favourite, multi-purpose, bidirectional solution I wrote many years ago:

function bgr2rgb($cr) {  // bidirectional
    return (($cr & 0x0000FF) << 16 | ($cr & 0x00FF00) | ($cr & 0xFF0000) >> 16);
}

Which you might want to use as :

function hex2cr($hex) {  // strips any leading characters, like #
    return bgr2rgb(hexdec($hex));
}

function cr2hex($cr) { // the usual HTML format, #rrggbb
    return '#'.str_pad(strtoupper(dechex(bgr2rgb($cr))), 6, '0', STR_PAD_LEFT);
}

And, if like me you tend to mistype function names, the synonym :

function rgb2bgr($val) { return bgr2rgb($val); }
up
1
sneskid at hotmail dot com
10 years ago
If you want to create or parse signed Hex strings:

<?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
$h = sdechex(-123); // string(3) "-7b"
$d = shexdec($h);   // int(-123)
var_dump($h, $d);
?>

Also note that ('0x' . $hexstr + 0) is faster than hexdec()
(Tested on PHP v5.2.17)
up
1
jose dot rob dot jr at gmail dot com
12 years ago
I made these functions to pack up to 64 ID's into a mysql unsigned bigint.

ID's cannot repeat, must be <= bit's limit and > 0.

The functions uses php 32 bit's int as unsigned because we don't actually read the number, just the bits. Then 0xFFFFFFFF display -1 but the bit's are there (tested with linux 2.6 i686 and x86_64)

---

This is an other way to make hex to bin conversions:

<?php
function hexbin($hex, $padding = false)
{
   
// Validation
   
$hex = preg_replace('/^(0x|X)?/i', '', $hex);
   
$hex = preg_replace('/[[:blank:]]/', '', $hex);
    if(empty(
$hex))
    {
       
$hex = '0';
    }
    if(!
preg_match('/^[0-9A-F]*$/i', $hex))
    {
       
trigger_error('Argument is not a hex', E_USER_WARNING);
        return
false;
    }
   
   
// Conversion
   
$bin = '';
   
$hex = array_reverse(str_split($hex));
    foreach(
$hex as $n)
    {
       
$n = hexdec($n);
        for(
$i = 1; $i <= 8; $i <<= 1)
        {
           
$bin .= ($i & $n)? '1' : '0';
        }
        if(
$padding)
        {
           
$bin .= ' ';
        }
    }
    return
ltrim(strrev($bin));
}

// Tests
echo "<b>Debug:</b> <pre>";

// Randomly choosed padded number
var_dump(hexbin('00FF FF8F 7F3F FF1F', true));
// string(79) "0000 0000 1111 1111 1111 1111 1000 1111 0111 1111 0011 1111 1111 1111 0001 1111"

// Yellow RGB
var_dump(hexbin('0xF8F800'));
// string(24) "111110001111100000000000"

// Green RGB (padded)
var_dump(hexbin('0x008800', true));
//string(29) "0000 0000 1000 1000 0000 0000"

die("\n<br>debug");

?>

Have fun ;D
up
1
Ultimater at gmail dot com
13 years ago
hexdec doesn't accept numbers following the period.
What if you have a number like c20.db18?
<?php
function floatinghexdec($str)
{
    list(
$intgr,$hex)=explode('.',$str,2);
   
$intgr=ereg_replace("[^A-Fa-f0-9]", "", $intgr);
   
$hex=ereg_replace("[^A-Fa-f0-9]", "", $hex);
   
$answer=0;
    for(
$i=0;$i < strlen($hex); $i++)
    {
       
$digit=hexdec(substr($hex,$i,1))/16;   // .f is 15/16 because in decimal .9 is 9/10
       
$answer += $digit/pow(16,$i);
    }
return
hexdec($intgr)+$answer;
}

echo
floatinghexdec("ff.ff");//255.99609375
?>
up
-1
helpmedalph at gmail dot com
6 years ago
function hex2rgb($hex) {
    if ($hex[0]=='#') $hex = substr($hex,1);
    if (strlen($hex)==3){
        $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
    }
    $int = hexdec($hex);
    return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
up
1
chrism at four dot net
20 years ago
hexdec from 4.1.0 onwards does not show
the same size limitation and therefore
works differently with large numbers than previous php versions.

To obtain the same results, use:

(int) hexdec (...)
up
0
joquius at kakugo dot com
13 years ago
Help a hex-stricken string get back to normal:

<?php
$str
= preg_replace_callback ("/%([a-zA-Z0-9]{2})/", create_function ('$matches', 'return chr (hexdec ($matches[1]));'), $str);
?>
up
0
Anonymous
14 years ago
// Função GET Cor Hexadecima e Retorna em RGB
function hexrgb($hexstr, $rgb) {
$int = hexdec($hexstr);
switch($rgb) {
        case "r":
        return 0xFF & $int >> 0x10;
            break;
        case "g":
        return 0xFF & ($int >> 0x8);
            break;
        case "b":
        return 0xFF & $int;
            break;
        default:
        return array(
            "r" => 0xFF & $int >> 0x10,
            "g" => 0xFF & ($int >> 0x8),
            "b" => 0xFF & $int
            );
            break;
    }   
}// END GET Cor Hex => RGB

//Uso
echo hexrgb("1a2b3c", r); // 26
echo hexrgb("1a2b3c", g); // 43
echo hexrgb("1a2b3c", b); // 60
//ou

var_dump(hexrgb("1a2b3c", rgb)); //array(3) { ["r"]=>  int(26) ["g"]=>  int(43) ["b"]=>  int(60) }
up
0
Manithu
15 years ago
This tiny function will return foreground colors (either black or white) in contrast to the color you provide:

<?php

function getContrastColor($color)
{
    return (
hexdec($color) > 0xffffff/2) ? '000000' : 'ffffff';
}

?>

This function will return the opposite (negative):

<?php

function negativeColor($color)
{
   
//get red, green and blue
   
$r = substr($color, 0, 2);
   
$g = substr($color, 2, 2);
   
$b = substr($color, 4, 2);
   
   
//revert them, they are decimal now
   
$r = 0xff-hexdec($r);
   
$g = 0xff-hexdec($g);
   
$b = 0xff-hexdec($b);
   
   
//now convert them to hex and return.
   
return dechex($r).dechex($g).dechex($b);
}

?>
up
0
cgarvis at gmail dot com
15 years ago
Here is my version of hex2rgb for web colors to 24bit colors.

<?php
function hex2rgb_webcolors($hex) {
   
$hex = eregi_replace("[^a-fA-F0-9]", "", $hex);
    switch(
strlen($hex) ) {
        case
2:
           
$hex = substr($hex,0,2)."0000";
            break;
        case
3:
           
$hex = substr($hex,0,1).substr($hex,0,1)
            .
substr($hex,1,1).substr($hex,1,1)
            .
substr($hex,2,1).substr($hex,2,1);
            break;
        case
4:
           
$hex = substr($hex,0,4)."00";
            break;
        case
6:
            break;
        default:
           
$hex = 0;
            break;
    }
    return
hexdec($hex);
}
?>
up
0
repley at freemail dot it
16 years ago
From color to color to ...... to color with fade effect. Good for dynamic bar chart.

<?php
//MultiColorFade(array hex-colors, int steps)
function MultiColorFade($hex_array, $steps) {

$tot = count($hex_array);
$gradient = array();
$fixend = 2;
$passages = $tot-1;
$stepsforpassage = floor($steps/$passages);
$stepsremain = $steps - ($stepsforpassage*$passages);

   for(
$pointer = 0; $pointer < $tot-1 ; $pointer++) {

      
$hexstart = $hex_array[$pointer];
      
$hexend = $hex_array[$pointer + 1];

       if(
$stepsremain > 0){
           if(
$stepsremain--){
              
$stepsforthis = $stepsforpassage + 1;
           }
       }else{
          
$stepsforthis = $stepsforpassage;
       }
   
       if(
$pointer > 0){
          
$fixend = 1;        
       }
   
      
$start['r'] = hexdec(substr($hexstart, 0, 2));
      
$start['g'] = hexdec(substr($hexstart, 2, 2));
      
$start['b'] = hexdec(substr($hexstart, 4, 2));

      
$end['r'] = hexdec(substr($hexend, 0, 2));
      
$end['g'] = hexdec(substr($hexend, 2, 2));
      
$end['b'] = hexdec(substr($hexend, 4, 2));

      
$step['r'] = ($start['r'] - $end['r']) / ($stepsforthis);
      
$step['g'] = ($start['g'] - $end['g']) / ($stepsforthis);
      
$step['b'] = ($start['b'] - $end['b']) / ($stepsforthis);
   
       for(
$i = 0; $i <= $stepsforthis-$fixend; $i++) {

          
$rgb['r'] = floor($start['r'] - ($step['r'] * $i));
          
$rgb['g'] = floor($start['g'] - ($step['g'] * $i));
          
$rgb['b'] = floor($start['b'] - ($step['b'] * $i));

          
$hex['r'] = sprintf('%02x', ($rgb['r']));
          
$hex['g'] = sprintf('%02x', ($rgb['g']));
          
$hex['b'] = sprintf('%02x', ($rgb['b']));
 
          
$gradient[] = strtoupper(implode(NULL, $hex));
       }
   }

  
$gradient[] = $hex_array[$tot-1];

return
$gradient;
}
//end MultiColorFade()

//start test
$multi_hex_array = array();
$multi_hex_array[] = array('FF0000','FFFF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000');
$multi_hex_array[] = array('FF0000','FFFF00','00FF00','00FFFF','0000FF','000000','FFFFFF');

foreach(
$multi_hex_array as $hex_array){

  
$totcolors = count($hex_array);
  
$steps = 44;

  
$a = MultiColorFade($hex_array, $steps);
  
$tot = count($a);

  
$table = '<table border=1 width="300">' . "\n";

   for (
$i = 0; $i < $tot; $i++){
      
$table .= ' <tr><td bgcolor="' . $a[$i] . '">' . ($i+1) .'</td><td><pre>' . $a[$i] . '</pre></td></tr>' . "\n";
   }

  
$table .= '</table><br /><br />';

   echo
'<br />Demanded steps = ' . $steps . '<br />';
   echo
'Returned steps = ' . $tot;

   if(
$steps == $tot){
       echo
'<br />OK.' . $steps . ' = ' . $tot . '<br />';
   }else{
       echo
'<br /><span style="color:#FF0000">FAILED! Demanded steps and returned steps are NOT equal!: ' . $steps . ' != ' . $tot . '</span><br />';
   }

   echo
$table;

}
//end test
?>

Repley.
up
0
cory at lavacube dot com
16 years ago
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. :-)
up
0
detrate at hotmail dot com
16 years ago
I made this for a little phpbb mod.  It was used to take the hex value from the database and make a color 20 (in decimal) less, resulting a darker color.

EXAMPLE: #336699 to #1f5285

<?php

$row1
= "336699"; // color
$c = 20;          // difference value

$rgb = array(substr($row1,0,2), substr($row1,2,2), substr($row1,4,2));

for(
$i=0; $i < 3; $i++)
{
  if((
hexdec($rgb[$i])-$c) >= 0)
  {
  
$rgb[$i] = hexdec($rgb[$i])-$c;

  
$rgb[$i] = dechex($rgb[$i]);
    if(
hexdec($rgb[0]) <= 9)
    
$rgb[$i] = "0".$rgb[$i];
  } else {
   
$rgb[$i] = "00";
  }
}

$row2 = $rgb[0].$rgb[1].$rgb[2];

?>
up
0
Gabriel Reguly
16 years ago
After esnhexdec from "rledger at gmail dot com",  the esndechex:

<?php
   
function esndechex($dec){
        
$a = strtoupper(dechex(substr($dec, 12)));
        
$b = strtoupper(dechex(substr($dec, 3, 10)));
         return
$a . $b;
    }
?>
up
0
bishop
17 years ago
Bullet-proof hex-to-rgb colour converter like brian at sagesport dot com wanted, just far fewer code lines. As a bonus, gives you the ability to return as string or array:

<?php
   
function &hex2rgb($hex, $asString = true)
    {
       
// strip off any leading #
       
if (0 === strpos($hex, '#')) {
           
$hex = substr($hex, 1);
        } else if (
0 === strpos($hex, '&H')) {
           
$hex = substr($hex, 2);
        }      

       
// break into hex 3-tuple
       
$cutpoint = ceil(strlen($hex) / 2)-1;
       
$rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3);

       
// convert each tuple to decimal
       
$rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0);
       
$rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0);
       
$rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0);

        return (
$asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb);
    }
?>

Handles 2, 3, and 6 character colour codes with leading # or &H.
up
-1
zubfatal, root at it dot dk
17 years ago
This replaces my previous class.
I've added a few more input checks in the rgb2hex function.
Also it returned incorrect hex values for 1-digit values.

color::rgb2hex(array(0,0,0)) would output 000 not 00000.

<?php

/**
* Convert colors
*
* Usage:
*  color::hex2rgb("FFFFFF")
*  color::rgb2hex(array(171,37,37))
*
* @author      Tim Johannessen <root@it.dk>
* @version     1.0.1
*/

class color {

   
/**
     * Convert HEX colorcode to an array of colors.
     * @return      array        Returns the array of colors as array(red,green,blue)
     */
    
   
function hex2rgb($hexVal = "") {
       
$hexVal = eregi_replace("[^a-fA-F0-9]", "", $hexVal);
        if (
strlen($hexVal) != 6) { return "ERR: Incorrect colorcode, expecting 6 chars (a-f, 0-9)"; }
       
$arrTmp = explode(" ", chunk_split($hexVal, 2, " "));
       
$arrTmp = array_map("hexdec", $arrTmp);
        return array(
"red" => $arrTmp[0], "green" => $arrTmp[1], "blue" => $arrTmp[2]);
    }
    
   
/**
     * Convert RGB colors to HEX colorcode
     * @return      string        Returns the converted colors as a 6 digit colorcode
     */
   
function rgb2hex($arrColors = null) {
        if (!
is_array($arrColors)) { return "ERR: Invalid input, expecting an array of colors"; }
        if (
count($arrColors) < 3) { return "ERR: Invalid input, array too small (3)"; }
        
       
array_splice($arrColors, 3);
        
        for (
$x = 0; $x < count($arrColors); $x++) {
            if (
strlen($arrColors[$x]) < 1) {
                return
"ERR: One or more empty values found, expecting array with 3 values";
            }
            
            elseif (
eregi("[^0-9]", $arrColors[$x])) {
                return
"ERR: One or more non-numeric values found.";
            }
            
            else {
                if ((
intval($arrColors[$x]) < 0) || (intval($arrColors[$x]) > 255)) {
                    return
"ERR: Range mismatch in one or more values (0-255)";
                }
                
                else {
                   
$arrColors[$x] = strtoupper(str_pad(dechex($arrColors[$x]), 2, 0, STR_PAD_LEFT));
                }
            }
        }
        
        return
implode("", $arrColors);
    }

}

?>
up
-1
groobo
17 years ago
It's just a revision to marfastic's ligten_up script, it simply adds/subtracts mod_color to orig_color.
I use it often to adjust tonals rather than brightness only

<?
function mod_color($orig_color, $mod, $mod_color){
    /*
        $orig_color - original html color, hex
        $mod_color - modifying color, hex
        $mod - modifier '+' or '-'
        usage: mod_color('CCCCCC', '+', '000033')
    */
    // does quick validation
    preg_match("/([0-9]|[A-F]){6}/i",$orig_color,$orig_arr);
    preg_match("/([0-9]|[A-F]){6}/i",$mod_color,$mod_arr);
    if ($orig_arr[0] && $mod_arr[0]) {
        for ($i=0; $i<6; $i=$i+2) {
            $orig_x = substr($orig_arr[0],$i,2);
            $mod_x = substr($mod_arr[0],$i,2);
            if ($mod == '+') { $new_x = hexdec($orig_x) + hexdec($mod_x); }
            else { $new_x = hexdec($orig_x) - hexdec($mod_x); }
            if ($new_x < 0) { $new_x = 0; }
            else if ($new_x > 255) { $new_x = 255; };
            $new_x = dechex($new_x);
            $ret .= $new_x;
        }
        return $ret;
    } else { return false; }
}
?>
up
-2
this1is4me at hotmail dot com
14 years ago
In reply to Amit Yadav's post (hex to binary conversion):

function binfromdec($num)
{
  $primary = "bit";
  for ($i=1; $i<=16; $i++)
    ${$primary.$i} = 0;
 
  if ($num & 32768)   $bit16  = 1;
  if ($num & 16384)   $bit15  = 1;
  if ($num & 8192)    $bit14  = 1;
  if ($num & 4096)    $bit13  = 1;
  if ($num & 2048)    $bit12  = 1;
  if ($num & 1024)    $bit11  = 1;
  if ($num & 512)     $bit10  = 1;
  if ($num & 256)     $bit9   = 1;
  if ($num & 128)     $bit8   = 1;
  if ($num & 64)      $bit7   = 1;
  if ($num & 32)      $bit6   = 1;
  if ($num & 16)      $bit5   = 1;
  if ($num & 8)       $bit4   = 1;
  if ($num & 4)       $bit3   = 1;
  if ($num & 2)       $bit2   = 1;
  if ($num & 1)       $bit1   = 1;
 
  return ($bit16. $bit15. $bit14. $bit13. $bit12. $bit11. $bit10. $bit9. $bit8. $bit7. $bit6. $bit5. $bit4. $bit3. $bit2. $bit1);
}
up
-2
maddddidley at yahoo dot com
14 years ago
Function that combines two rgb colors.

function combineColors($color1, $color2) {
       
        $color1 = str_replace("#", '', $color1);
        $color2 = str_replace("#", '', $color2);
       
        $r1 = hexdec(substr($color1, 0, 2));
        $g1 = hexdec(substr($color1, 2, 2));
        $b1 = hexdec(substr($color1, 4, 2));
       
        $r2 = hexdec(substr($color2, 0, 2));
        $g2 = hexdec(substr($color2, 2, 2));
        $b2 = hexdec(substr($color2, 4, 2));
       
        $r3 = ceil(($r1 + $r2) / 2);
        $g3 = ceil(($g1 + $g2) / 2);
        $b3 = ceil(($b1 + $b2) / 2);
       
       
        $color = rgbhex($r3, $g3, $b3);
        return $color = str_replace("#", '', $color);
       
    }
up
-2
andreas.schmeiler
19 years ago
Here's another hex2bin variant, works pretty well to me.

function hex2bin($hexdata) {
  
   for ($i=0;$i<strlen($hexdata);$i+=2) {
      $bindata.=chr(hexdec(substr($hexdata,$i,2)));
   }
  
   return $bindata;
}
up
-1
ayadav at infoprocorp dot com
16 years ago
From Amit Yadav

Hex to binary conversion

$num = hexdec("20DF");
echo binfromdec($num);

function binfromdec($num)
{
    if ($num > 32766)    return ("Too Large!");
    if ($num & 16384)    $bit15 = 1;
    if ($num & 8192)    $bit14 = 1;
    if ($num & 4096)    $bit13 = 1;
    if ($num & 2048)    $bit12 = 1;
    if ($num & 1024)    $bit11 = 1;
    if ($num & 512)        $bit10 = 1;
    if ($num & 256)        $bit9 = 1;
    if ($num & 128)        $bit8 = 1;
    if ($num & 64)        $bit7 = 1;
    if ($num & 32)        $bit6 = 1;
    if ($num & 16)        $bit5 = 1;
    if ($num & 8)        $bit4 = 1;
    if ($num & 4)        $bit3 = 1;
    if ($num & 2)        $bit2 = 1;
    if ($num & 1)        $bit1 = 1;

    return ("" . $bit15 . $bit14 . $bit13 . $bit12 . $bit11 . $bit10 . $bit9 . $bit8 . $bit7 . $bit6 . $bit5 . $bit4 . $bit3 . $bit2 . $bit1);

}
up
-1
andy at haveland dot com
11 years ago
Here's a short example to convert strings between hex and chars:

<?php
print hextostr("616E647940686176656C616E642E636F6D")."\n";

print
strtohex("Knowledge is power")."\n";

function
hextostr($x) {
 
$s='';
  foreach(
explode("\n",trim(chunk_split($x,2))) as $h) $s.=chr(hexdec($h));
  return(
$s);
}

function
strtohex($x) {
 
$s='';
  foreach(
str_split($x) as $c) $s.=sprintf("%02X",ord($c));
  return(
$s);
}
?>
up
-1
Rosberg - rosberglinhares at gmail dot com
12 years ago
The correct version is:

function bchexdec($hex) {
    static $hexdec = 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
    );

    $dec = 0;

    for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
        $factor = $hexdec[$hex[$i]];
        $dec = bcadd($dec, bcmul($factor, $e));
    }

    return $dec;
}

官方地址:https://www.php.net/manual/en/function.hexdec.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3