PHPのお勉強!

PHP TOP

hexdec

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

hexdec16 進数を 10 進数に変換する

説明

hexdec(string $hex_string): int|float

引数 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)" を出力
?>

注意

注意:

この関数は、プラットフォームの int 型に収まらない大きな数も変換できます。 その場合、結果は float で返します。

参考

  • dechex() - 10 進数を 16 進数に変換する
  • bindec() - 2 進数 を 10 進数に変換する
  • octdec() - 8 進数を 10 進数に変換する
  • base_convert() - 数値の基数を任意に変換する

add a note

User Contributed Notes 31 notes

up
30
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
up
3
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
?>
up
3
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 (...)
up
5
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;
}
?>
up
2
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) }
up
2
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. :-)
up
2
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; }
}
?>
up
6
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;
}

?>
up
3
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.
up
5
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().]
up
3
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)
up
3
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);
}
?>
up
4
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! :)
up
6
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));
?>
up
1
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);
}
up
2
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);
}

?>
up
1
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);
}

}

?>
up
4
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);
}
?>
up
2