php将16进制转换成10进制的函数hexdec 晴

jed , 2006-10-2 16:58 , 代码编程 , 评论(0) , 阅读(7596) , Via 本站原创 | |
hexdec
(PHP 3, PHP 4, PHP 5)

hexdec -- 十六进制转换为十进制
说明
number hexdec ( string hex_string )


返回与 hex_string 参数所表示的十六进制数等值的的十进制数。hexdec() 将一个十六进制字符串转换为十进制数。所能转换的最大数值为 7fffffff,即十进制的 2147483647。PHP 4.1.0 开始,该函数可以处理大数字,这种情况下,它会返回 float 类型。

hexdec() 将遇到的所有非十六进制字符替换成 0。这样,所有左边的零都被忽略,但右边的零会计入值中。 例子 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)"
?>  



参见 dechex(),bindec(),octdec() 和base_convert()。



add a note User Contributed Notes

ayadav at infoprocorp dot com
28-Dec-2005 04:03
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);

}
cory at lavacube dot com
29-Oct-2005 04:59
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. :-)
hajamie@home
24-Oct-2005 10:38
This function will take a hex $color, e.g. fa34bc and make it the shade you want, e.g. anywhere between 0 and 255. The smaller the number, the darker the output color.  It keeps the color the same, only changing the shade.  

function correctshade($color, $shade)
{
$r = hexdec(substr($color,0,2));
$g = hexdec(substr($color,2,2));
$b = hexdec(substr($color,4,2));
$sum = ($r + $g + $b);
$x = (($shade * 3) - $sum) / $sum;
if ($x >= 0) {
$x = $x + 1;
} else {
$x = 1 + $x;
}
$r = intval($x * $r);
$g = intval($x * $g);
$b = intval($x * $b);
$r = dechex($r);
$g = dechex($g);
$b = dechex($b);
return $r.$g.$b;
}
09-Oct-2005 01:53
I needed to get the opposite colors so my website would be soft on the eyes.

<?php
function OppositeHex($color)
{
$r = dechex(255 - hexdec(substr($color,0,2)));
$r = (strlen($r) > 1) ? $r : '0'.$r;
$g = dechex(255 - hexdec(substr($color,2,2)));
$g = (strlen($g) > 1) ? $g : '0'.$g;
$b = dechex(255 - hexdec(substr($color,4,2)));
$b = (strlen($b) > 1) ? $b : '0'.$b;
return $r.$g.$b;
}

//Example
$color = '000000';
echo 'The opposite of #'.$color.' is #'.OppositeHex($color).';
?>
detrate at hotmail dot com
30-Sep-2005 09:38
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];

?>
Gabriel Reguly
17-Aug-2005 02:24
After esnhexdec from "rledger at gmail dot com",  the esndechex:

<?php
  function esndechex($dec){
        $a = strtoupper(dechex(substr($dec, 1,  2)));
        $b = strtoupper(dechex(substr($dec, 3, 10)));
        return $a . $b;
  }
?>
djneoform at gmail dot com
21-Jun-2005 12:51
since i couldn't find one, here's an HEX to ASCII converter..

(takes HEX strings (in ASCII) and converts each two digit HEX code into it's ASCII equivalent)

function hex2ascii($str)
{
  $p = '';
  for ($i=0; $i < strlen($str); $i=$i+2)
  {
      $p .= chr(hexdec(substr($str, $i, 2)));
  }
  return $p;
}
bishop
05-Jun-2005 10:51
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.
Joey Morwick
03-May-2005 04:07
I found it helpful to have the inverse / reverse of this function laying around, since I wanted to insert some binary data into an xmlrpc call (it currently craps out when you do that), and I couldn't find one laying around, so here's a simple little function to do that:

function hex2bin($str) {
  $build = '';
  while(strlen($str) > 1) {
      $build .= chr(hexdec(substr($str, 0, 2)));
      $str = substr($str, 2, strlen($str)-2);
  }
  return $build;
}
rledger at gmail dot com
29-Mar-2005 03:59
To convert a cellular ESN from hexadecimal to decimal, use the following code. The base conversion is different due to the fact that the first two characters of a hexadecimal value must be converted seperately from the remaining six characters.
<?
function esnhexdec($hex){
  $a = sprintf("%03d", hexdec(substr($hex, 0, 2)));
  $b = sprintf("%08d", hexdec(substr($hex, 2, 6)));
  return $a . $b;
}
?>
zubfatal, root at it dot dk
25-Mar-2005 06:36
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);
  }

}

?>
brian at sagesport dot com
23-Mar-2005 01:08
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.
groobo
11-Feb-2005 03:46
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; }
}
?>
20-Jan-2005 01:33
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! :)
marfastic
10-Dec-2004 11:14
Here is a function to brighten up any color:

function lighten_up($orig_color, $fraction_denom){
          // return the color between the color and white
          // based on the fraction denom that is passed
         
          if(!isset($fraction_denom))
              $fraction_denom = 2;
          $highest_val = hexdec("FF");
          $r = hexdec(substr($orig_color,0,2));
          $r = ($highest_val-$r)/$fraction_denom + $r;
          $g = hexdec(substr($orig_color,2,2));
          $g = ($highest_val-$g)/$fraction_denom + $g;
          $b = hexdec(substr($orig_color,4,2));
          $b = ($highest_val-$b)/$fraction_denom + $b;
          return dechex($r) . dechex($g) . dechex($b);
      }
_meto ALT+q web.de
09-May-2004 12:00
Damn, this took me some real long time! Maybe it's helpfull for those who even have no idea of color-Schemes like me ;)

If u want to generate PDF's for Print Offices u need to set all the colors in CMYK.

Here is a Function that will convert RGB to CMYK

<?
function hex2rgb($hex) {
 $color = str_replace('#','',$hex);
 $rgb = array('r' => hexdec(substr($color,0,2)),
              'g' => hexdec(substr($color,2,2)),
              'b' => hexdec(substr($color,4,2)));
 return $rgb;
}

function rgb2cmyk($var1,$g=0,$b=0) {
  if(is_array($var1)) {
    $r = $var1['r'];
    $g = $var1['g'];
    $b = $var1['b'];
  }
  else $r=$var1;
  $cyan    = 255 - $r;
  $magenta = 255 - $g;
  $yellow  = 255 - $b;
  $black  = min($cyan, $magenta, $yellow);
  $cyan    = @(($cyan    - $black) / (255 - $black)) * 255;
  $magenta = @(($magenta - $black) / (255 - $black)) * 255;
  $yellow  = @(($yellow  - $black) / (255 - $black)) * 255;
  return array('c' => $cyan / 255,
              'm' => $magenta / 255,
              'y' => $yellow / 255,
              'k' => $black / 255);
}

$color=rgb2cmyk(hex2rgb('#FF0000'));
pdf_setcolor($pdf, "both", "cmyk", $color['c'], $color['m'], $color['y'], $color['k']);
?>

U can call it with parameters (r,g,b) or just with an array(r,g,b) that contains these values.

Hope it works correct. All testing was fine.
gelado at ip3 dot com
29-Aug-2003 07:30
Another hex to decimal converter, up to the precision of PHP floats.

function longhex($hex)
{
  $dec = 0;
  $bitval = 1;
  for($pos = 1; $pos <= strlen($hex); $pos++) {
      $dec += hexdec(substr($hex, -$pos, 1)) * $bitval;
      $bitval *= 16;
  }
  return($dec);
}
henrique at recidive dot com
28-May-2003 06:43
Function to convert a string with hexadecimal colors to an associative array with RGB values:

<?
function hex2dec($hex) {
 $color = str_replace('#', '', $hex);
 $ret = array(
  'r' => hexdec(substr($color, 0, 2)),
  'g' => hexdec(substr($color, 2, 2)),
  'b' => hexdec(substr($color, 4, 2))
 );
 return $ret;
}

/*** Example:
print_r(hex2dec('3D58BE'));

or

print_r(hex2dec('#3D58BE'));

will return

Array
(
 [r] => 61
 [g] => 88
 [b] => 190
)
***/
?>

Thanks !

Henrique Recidive
andreas.schmeiler
05-Feb-2003 09:59
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;
}
chrism at four dot net
16-Dec-2001 02:02
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 (...)
andychase at yahoo dot com
18-Jan-2001 10:32
For hex numbers larger than 7FFFFFFF (E.G. PalmOS dates in seconds elapsed since 01/01/1904), I came up with this:

function bighexdec($hexnumber){

  $numlength = strlen($hexnumber);

  $decnumber = 0;

  for($x = 1; $x <= $numlength; $x++){

      $place = $numlength - $x;
     
      $operand = hexdec(substr($hexnumber,$place,1));
         
      $exponent = pow(16,$x-1);

      $decValue = $operand * $exponent;
 
      $decnumber += $decValue;

  }

  return $decnumber;
 
}
joe at aigraphics dot com
21-Oct-2000 06:32
Here is a fast block of code to convert HTML Style HEX colors to RGB:
--------------------
$r = hexdec(substr($color, 0, 2));
$g = hexdec(substr($color, 2, 2));
$b = hexdec(substr($color, 4, 2));
--------------------
hope it helps you, enjoy.
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]