PHP Conference Japan 2024

dechex

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

dechex十進位轉十六進位

描述

dechex(int $num): string

返回一個字串,其中包含給定無號 num 引數的十六進位表示法。

可以轉換的最大數字是 PHP_INT_MAX * 2 + 1 (或 -1):在 32 位元平台上,這將是十進位的 4294967295,這會導致 dechex() 返回 ffffffff

參數

num

要轉換的十進位值。

由於 PHP 的 int 型別是有號的,但 dechex() 處理無號整數,因此負整數將被視為無號整數。

回傳值

num 的十六進位字串表示法。

範例

範例 #1 dechex() 範例

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

上述範例會輸出

a
2f

範例 #2 dechex() 大型整數範例

<?php
// 下方的輸出假設為 32 位元平台。
// 請注意,所有值的輸出都相同。
echo dechex(-1)."\n";
echo
dechex(PHP_INT_MAX * 2 + 1)."\n";
echo
dechex(pow(2, 32) - 1)."\n";
?>

上述範例會輸出

ffffffff
ffffffff
ffffffff

參見

新增註解

使用者貢獻的註解 34 則註解

87
brent
17 年前
如果數字儲存在字串中,請非常小心地對其呼叫 dechex。

例如

它可以處理的最大數字是 4294967295,如文件所述,其十六進位為 FFFFFFFF。

dechex(4294967295) => FFFFFFFF //正確

但是,如果對數字字串呼叫它,它會轉換為 int,並自動給您它可以處理的最大 int。

dechex('4294967295') => 7FFFFFFF //錯誤!

因此您需要轉換為浮點數

dechex((float) '4294967295') => FFFFFFFF //正確

我花了很久才弄清楚這一點,希望我只是為某人節省了一些時間。
15
joost at bingopaleis dot com
22 年前
這裡有兩個函式,可以將大的十進位數字轉換為十六進位,反之亦然。我的意思是真的很大,比先前發布的任何函式都大得多。

<pre>
// 輸入:十進位數字作為字串。
// 輸出:等效的十六進位數字作為字串。
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;
}

// 輸入:十六進位數字作為字串。
// 輸出:等效的十進位數字作為字串。
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>
8
jrisken at mn dot rr dot com
19 年前
一種不那麼優雅但(可能)更快的填充方法是使用具有負長度引數的 substr。我在這個微小的函式中使用它,該函式會為樣式表格式化計算的 rgb 顏色代碼
<?
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}
?>
4
mina86 at tlen dot pl
20 年前
建立隨機十六進位顏色的最簡單 :P 方法

<?php
function rand_color() {
return
substr('00000' . dechex(mt_rand(0, 0xffffff)), -6);
}
?>
1
baoquyen804 at gmail dot com
10 年前
這個基本函式將字串 rgb 轉換為顏色
<?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
?>
4
Anonymous
19 年前
如果您需要產生隨機的 HEX 色碼,請使用以下程式碼
<?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
?>

請享用。
1
sneskid at hotmail dot com
12 年前
如果您想建立或解析帶正負號的十六進位數值

<?php
// $d 應該是一個整數
function sdechex($d) { return ($d<0) ? ('-' . dechex(-$d)) : dechex($d); }

// $h 應該是一個字串
function shexdec($h) { return ($h[0] === '-') ? -('0x' . substr($h,1) + 0) : ('0x' . $h + 0); }

// 測試

$v = sdechex(-123); // string(3) "-7b"
$i = shexdec($v); // int(-123)
var_dump($v, $i);
?>

另外請注意,('0x' . $str + 0) 比 hexdec() 快。
2
mountarreat at gmail dot com
16 年前
我曾遇到一個問題,需要在 php 中進行大數值的計算並轉換為十六進位。該計算超出了無號整數甚至是浮點數的範圍。您可以輕鬆地根據您的需求進行更改,但由於使用了 bcmath,它能夠透過字串處理大數值。此函式會將它們轉換為十六進位。

不過,在這個特定的範例中,由於我將它用於只能處理 32 位元數值的遊戲內部,它將會截斷計算結果至 8 位數。例如,如果輸入為 1,它會用零填充。輸出 00000001h。

當然,我不認為這是一個好的程式碼,但它適用於我和我的目的。歡迎提供關於更快程式碼的建議!

<?php
// 將數字轉換為 32 位元十六進位字串;用零填充
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);
}
?>
1
Mista-NiceGuy at web dot de
18 年前
這些是將羅馬數字(例如 MXC)轉換為十進位數字,反之亦然的函式。
注意:romdec() 不會檢查字串是否真的是羅馬數字。要強制使用者輸入為真正的羅馬數字,請使用 decrom(romdec($input))。例如,這會將 XXXX 變成 XL。

<?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"));
?>
4
admin AT bobfrank DOT org
19 年前
這是一個非常小的零填充函式,你可以用它來處理數字

function zeropad($num, $lim)
{
return (strlen($num) >= $lim) ? $num : zeropad("0" . $num);
}

zeropad("234",6);

會產生
000234

zeropad("234",1);

會產生
234
2
monkyNOSPAM at phpfi dot org dot invalid
22 年前
這裡是如何使用位元運算進行 RGB2hex 轉換的方法。這個函式會回傳十六進位的 rgb 值,就像上面 gurke@bigfoot.com 提交的那樣。

function hexColor($color) {
return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}

範例

$col[0] = 25;
$col[1] = 255;
$col[2] = 55;

print hexColor($col);
4
jbleau at gmail dot com
16 年前
我對 dechex 的大小限制感到困惑。這是我的解決方案。它支援更大的數值,也支援正負號。

<?php
function dec_to_hex($dec)
{
$sign = ""; // 抑制錯誤
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;
}
?>
1
delchodimi at gmail dot com
9 年前
我喜歡使用位元運算的範例,但是如果 color[0] 的值小於 16,它就不準確了
範例
color[0]: 0;
color[1]: 0;
color[2]: 255;
function hexColor($color) {
return dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
}
它會回傳 "ff",這不是合法的 RGB 色彩...
所以我的解決方案是將上面的函式與以下結合
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}

如果你需要處理 rgb 值的陣列,這是我的解決方案
------------------------------------------------------
function hexColor($color) {
$rgb = dechex(($color[0]<<16)|($color[1]<<8)|$color[2]);
return("#".substr("000000".$rgb, -6));
}
------------------------------------------------------
2
huda m elmatsani <justhuda at netscape dot net>
21 年前
建立隨機十六進位色彩

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);
//轉換為十六進位
return sprintf("%02X",$randval);
}

function random_color(){
return "#".rand_hex().rand_hex().rand_hex();
}

hme ;)
3
andries at centim dot be
12 年前
如果你需要將一個大數字 (> PHP_MAX_INT) 轉換為十六進位值,只需使用 base_convert。例如

base_convert('2190964402', 10, 16); // 829776b2
1
hmlinks at gmail dot com
12 年前
我寫這個函式是為了將十六進位轉換為帶正負號的整數,希望這對某人有幫助... peace :)

<?php
$hex
= dechex(-32767);
$dec = shexdex($hex);

function
shexdex($hex){
$dec = hexdec($hex);

// 負數(在二進位中,如果 msb 為 1,則為負數)
// 因為一個十六進位是 4 位元,值 8 和以上包含 msb 為 1,因此為負數
if ($hex[0] >= '8'){ // 注意:如果你使用數字 8,它與 '8' 不同
$dec -= 1;
$dec = ~$dec;

return -
$dec;
}

return
$dec;
}

if (
$dec == -32767){
echo
'Yay!';
}
?>
1
sjaak at spoilerfreaks dot com
17 年前
若要在某些函式中強制正確使用 32 位元無號整數,只需在處理它們之前加上 '+0'。

例如
<?php echo(dechex("2724838310")); ?>
會印出 '7FFFFFFF'
但它應該印出 'A269BBA6'

當加上 '+0' 時,php 會正確處理 32 位元無號整數
正確地
<?php echo(dechex("2724838310"+0)); ?>
將會印出 'A269BBA6'
1
allan-wegan at allan-wegan dot de
21 年前
現在,這裡有一個很好又小的函式,可以將整數轉換為十六進制字串,並且避免使用 DECHEX 函式,因為該函式過去經常變更其行為(現在,在 PHP 4.3.2 版本中,它可以正確地處理大於 0x7FFFFFFF 的數字,但我需要向後相容)。

function &formatIntegerForOutput($value) {
$text = "00000000";
$transString = "0123456789ABCDEF";
// 處理最高位元組 (nibble 7)
$nibble = $value & 0x70000000;
$nibble >>= 28;
if ($value < 0) {
$nibble = $nibble | 0x00000008;
}
$text[0] = $transString[$nibble];
$value &= 0x0FFFFFFF;
// 位元組 0 到 6
for ($a = 7; $a > 0; $a --) {
$nibble = $value & 0x0000000F;
$text[$a] = $transString[$nibble];
$value >>= 4;
}
return $text
}

這個函式應該不會太慢,而且非常簡單。
我不知道 DECHEX 函式未來是否會將其輸出填充為 8 個字元的長度,因此為了向後相容的原因,即使在未來的 PHP 版本中,我也避免使用它。
1
Anonymous
19 年前
如果您需要將 RGB 色彩轉換為 HEX 色彩,請使用這個
<?php
function rgb2hex($rgb){
return
sprintf("%06X", $rgb);
}
$hex = rgb2hex(65280); // 00FF00
?>
2
mahdiyari
2 年前
以 2 (8 位元) 為一組的零填充十六進制字串。

<?php
function dec2hex($int) {
$hex = dechex($int);
if (
strlen($hex)%2 != 0) {
$hex = str_pad($hex, strlen($hex) + 1, '0', STR_PAD_LEFT);
}
return
$hex;
}

dec2hex(2); // 02
dec2hex(10); // 0a
dec2hex(256); // 0100
?>
2
hugo
7 年前
警告 jbleau 的 dec_to_hex 方法有錯誤,請避免使用。

dec_to_hex('9900000397')-->24e16048f
dec_to_hex('9900000398')-->24e16048f
dec_to_hex('9900000399')-->24e16048f
2
mailderemi at gmail dot com
11 年前
Javascript 加密

<?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);
?>
0
jenny-schubert87 dot 1 at web dot de
10 年前
我發現了另一種方法可以做到這一點
如果您有一個 gmp 格式的非常長的十進制數字(您始終可以使用 gmp_init($numberstring) 建立一個 gmp 數字),您可以簡單地執行 gmp_strval($gmpnumber, 16),其中 $gmpnumber 是您的 gmp 數字,而 16 是您要轉換的基數。對我來說效果很好,也適用於其他基數。
1
oliver at realtsp dot com
19 年前
在 64 位元機器上使用時請注意!額外的長度很重要!

32 位元機器
php -r 'echo dechex(4294967295);'
輸出:ffffffff

64 位元機器
php -r 'echo dechex(4294967295);'
輸出:ffffffff

到目前為止還好。但是對於稍微大一點的數字

32 位元機器
php -r 'echo dechex(4294967296);'
輸出:0

64 位元機器
php -r 'echo dechex(4294967296);'
輸出:100000000

注意差異!

這在轉換負數時尤其重要

64 位元機器
php -r 'echo dechex(-1);'
輸出:ffffffffffffffff

32 位元機器
php -r 'echo dechex(-1);'
輸出:ffffffff

如果您希望您的程式碼可以移植到 amd64 或 xeon(現在在主機公司中相當流行),那麼您必須確保您的程式碼可以處理負數(以及最大值,雖然這可能不太關鍵)的不同結果長度。
1
wangster at darkcore dot net
19 年前
此函式會接受一個字串並將其轉換為十六進制轉儲。

例如:

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;
}
1
daevid at daevid dot com
20 年前
這是我的紅色->黃色->綠色漸層版本

<?php
function colorMeter($percent, $invert = false)
{
//$percent 的範圍是 0.0 <= percent <= 1.0
// 整數會被假設為 0% - 100%
// 並轉換為浮點數 0.0 - 1.0
// 0.0 = 紅色, 0.5 = 黃色, 1.0 = 綠色
//$invert 會反轉顏色刻度
// 0.0 = 綠色, 0.5 = 黃色, 1.0 = 紅色

//將 (int)% 值轉換為 (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
?>

像這樣使用它

<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>
1
thr at recide dot net
20 年前
/*
* 將 RGB 色碼 (例如:255 0 255) 轉換為 HEX 色碼 (例如:FF00FF)
*/
function rgb2hex($rgb){
if(!is_array($rgb) || count($rgb) != 3){
echo "參數必須是一個具有 3 個整數元素的陣列";
return false;
}
for($i=0;$i<count($rgb);$i++){
if(strlen($hex[$i] = dechex($rgb[$i])) == 1){
$hex[$i] = "0".$hex[$i];
}
}
return $hex;
}
/* 範例 */
print_r(rgb2hex(array(10,255,255)));
0
cory at lavacube dot com
19 年前
一個方便的小函式,可將 HEX 色碼轉換為「網頁安全」顏色...

<?php

function color_mkwebsafe ( $in )
{
// 將數值放入易於使用的陣列中
$vals['r'] = hexdec( substr($in, 0, 2) );
$vals['g'] = hexdec( substr($in, 2, 2) );
$vals['b'] = hexdec( substr($in, 4, 2) );

// 迴圈處理
foreach( $vals as $val )
{
// 轉換數值
$val = ( round($val/51) * 51 );
// 轉換為十六進制
$out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
}

return
$out;
}

?>

範例:color_mkwebsafe('0e5c94');
產生:006699

希望這對大家有幫助... 祝您編碼愉快。 :-)
1
jfren484 at hotmail dot com
22 年前
這裡有一個函式,它適用於高達 9007199254740992 (十六進制 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;
}
1
kristoffer at caveo dot se
22 年前
這是一個十進制轉 HTML 十六進制漸層的範例。玩得開心:)

//漸層的數量
$l = 20;

//起始顏色
$start[0] = "255"; //紅色
$start[1] = "0"; //綠色
$start[2] = "255"; //藍色

//結束顏色
$end[0] = "255"; //紅色
$end[1] = "255"; //綠色
$end[2] = "255"; //藍色

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++;

}

?>
0
morten at nilsen dot com
19 年前
我看到這個頁面上發布了很多不夠完善的函式,所以我認為我必須提供一些更好的範例...
由於這個集合的龐大規模,我已將其放在我的伺服器上,而不是將其複製/貼上到這些評論中。

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

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

來自上述來源的 dechex 替換函式
<?php
define
('BIT_BYTE', 8); // 每個位元組的位元數
define('HEX_BYTE', BIT_BYTE/4); // 一個位元組中的十六進制數字

define('BIT_INT', 32); // sizeof(int)
define('HEX_INT', BIT_INT / (BIT_BYTE/HEX_BYTE)); // 一個整數中的十六進制數字

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());
?>
0
admin[TAKETHISOUT] at torsoft dot no-ip dot com
20 年前
<?php
/*
這裡有兩個函式,有些人可能會覺得有用(也許用於編碼)
將字串轉換為十六進制,以及將十六進制轉換為字串:
*/

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;
}
?>
-1
9381904 at gmail dot com
13 年前
適用於 MAC 位址
<?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
?>
-3
Kory P.
11 年前
或者,您可以將此用於 RGBA 顏色。
function toAlphaColor($n,$a)
{
$rgb = substr("000000".dechex($n),-6);
$alpha = substr("00".dechex($a),-2);
return("#".$rgb.$alpha);
}
To Top