hexdec
(PHP 4, PHP 5, PHP 7, PHP 8)
hexdec — 16 進数を 10 進数に変換する
説明
引数 hex_string
により指定された 16 進数に
等価な 10 進数を返します。hexdec() は、16 進数を
表す文字列を 10 進数に変換します。
hexdec() は、16 進数以外の文字を一切無視します。 PHP 7.4.0 以降では、無効な文字を与えることは推奨されません。
パラメータ
hex_string
-
変換したい 16 進文字列。
戻り値
hex_string
を 10 進で表した値を返します。
変更履歴
バージョン | 説明 |
---|---|
7.4.0 | 無効な文字を与えると、非推奨の警告が出るようになりました。 結果は不正な文字がなかったかのように計算されます。 |
例
例1 hexdec() の例
<?php
var_dump(hexdec("See"));
var_dump(hexdec("ee"));
// 共に "int(238)" を出力
var_dump(hexdec("that")); // "int(10)" を出力
var_dump(hexdec("a0")); // "int(160)" を出力
?>
参考
- dechex() - 10 進数を 16 進数に変換する
- bindec() - 2 進数 を 10 進数に変換する
- octdec() - 8 進数を 10 進数に変換する
- base_convert() - 数値の基数を任意に変換する
+add a note
User Contributed Notes 31 notes
hafees at msn dot com ¶
14 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
Ultimater at gmail dot com ¶
15 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
?>
chrism at four dot net ¶
23 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 (...)
Gabriel Reguly ¶
19 years ago
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;
}
?>
Anonymous ¶
17 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) }
cory at lavacube dot com ¶
19 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. :-)
groobo ¶
19 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; }
}
?>
flurinj at gmx dot net ¶
14 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;
}
?>
brian at sagesport dot com ¶
19 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.
Halit YEL - halityesil at globya dot net ¶
15 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().]
sneskid at hotmail dot com ¶
12 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)
programacion at mundosica dot com ¶
13 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);
}
?>
Anonymous ¶
19 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! :)
chuckySTAR ¶
15 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));
?>
helpmedalph at gmail dot com ¶
8 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);
}
Manithu ¶
17 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);
}
?>
zubfatal, root at it dot dk ¶
19 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);
}
}
?>
k10206 at naver dot com ¶
17 years ago
<?
function hexrgb($hexstr) {
$int = hexdec($hexstr);
return array("red" => 0xFF & ($int >> 0x10), "green" => 0xFF & ($int >> 0x8), "blue" => 0xFF & $int);
}
?>