2024 年 PHP 开发者大会日本站

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 条笔记

brent
17 年前
如果数字存储在字符串中,请非常小心地对它调用 dechex。

例如

它可以处理的最大数字是 4294967295,十六进制为 FFFFFFFF,正如文档中所述。

dechex(4294967295) => FFFFFFFF // 正确

但是,如果对数字字符串调用它,它会强制转换为 int,并自动给出它可以处理的最大 int。

dechex('4294967295') => 7FFFFFFF // 错误!

所以你需要强制转换为浮点数

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

我花了很长时间才弄明白这一点,所以希望我节省了别人的时间。
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>
jrisken at mn dot rr dot com
19 年前
一种不太优雅但(可能)更快的方法是用带有负长度参数的 substr 进行填充。我在这个微小的函数中使用它,该函数为样式表格式化计算的 rgb 颜色代码
<?
function toColor($n)
{
return("#".substr("000000".dechex($n),-6));
}
?>
mina86 at tlen dot pl
20 年前
创建随机十六进制颜色最简单的方法 :P

<?php
function rand_color() {
return
substr('00000' . dechex(mt_rand(0, 0xffffff)), -6);
}
?>
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
?>
匿名用户
19 年前
如果您需要生成随机十六进制颜色,请使用此方法
<?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
?>

享受。
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() 更快
[email protected]
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);
}
?>
[email protected]
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"));
?>
[email protected]
19 年前
这是一个非常小的零填充函数,您可以用于数字

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

zeropad("234",6);

将产生
000234

zeropad("234",1);

将产生
234
[email protected]
22 年前
以下是如何使用按位运算进行 RGB2hex 转换。此函数返回十六进制 rgb 值,就像 [email protected] 以上提交的一样。

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);
[email protected]
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;
}
?>
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));
}
------------------------------------------------------
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 ;)
andries at centim dot be
12 年前
如果你需要将一个很大的数(> PHP_MAX_INT)转换为十六进制值,只需使用base_convert。例如:

base_convert('2190964402', 10, 16); // 829776b2
hmlinks at gmail dot com
12 年前
我写了这个函数来将十六进制转换为带符号整数,希望对其他人有所帮助...和平 :)

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

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

// 负数(如果最高有效位为1,则其二进制表示为负)
// 由于一个十六进制数是4位,8及以上的值包含最高有效位为1,因此为负数
if ($hex[0] >= '8'){ // 注意:如果使用数字8,它与'8'不同
$dec -= 1;
$dec = ~$dec;

return -
$dec;
}

return
$dec;
}

if (
$dec == -32767){
echo
'Yay!';
}
?>
sjaak at spoilerfreaks dot com
17 年前
为了强制在某些函数中正确使用32位无符号整数,只需在处理它们之前添加'+0'。

例如:
<?php echo(dechex("2724838310")); ?>
将打印'7FFFFFFF'
但它应该打印'A269BBA6'

添加'+0'后,PHP将正确处理32位无符号整数。
正确地
<?php echo(dechex("2724838310"+0)); ?>
将打印'A269BBA6'
allan-wegan at allan-wegan dot de
21年前
现在,这里有一个简洁的小函数可以将整数转换为十六进制字符串,并且避免使用DECHEX函数,因为该函数在过去经常改变其行为(现在,在PHP 4.3.2版本中,它可以正确处理大于0x7FFFFFFF的数字,但我需要向后兼容)。

function &formatIntegerForOutput($value) {
$text = "00000000";
$transString = "0123456789ABCDEF";
// 处理最高半字节(第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版本中,我也避免使用它。
匿名用户
19 年前
如果你需要将RGB颜色转换为HEX颜色,请使用这个:
<?php
function rgb2hex($rgb){
return
sprintf("%06X", $rgb);
}
$hex = rgb2hex(65280); // 00FF00
?>
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
?>
hugo
7年前
警告jbleau dec_to_hex方法有bug,避免使用它。

dec_to_hex('9900000397')-->24e16048f
dec_to_hex('9900000398')-->24e16048f
dec_to_hex('9900000399')-->24e16048f
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);
?>
jenny-schubert87 dot 1 at web dot de
10 年前
我想出了另一种方法来做这个。
如果你有一个非常长的GMP格式的十进制数(你可以随时使用gmp_init($numberstring)创建一个GMP数),你可以简单地执行gmp_strval($gmpnumber, 16),其中$gmpnumber是你的GMP数,16是要转换到的基数。对我来说效果很好,对其他基数也适用。
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);'
输出:ffffffffffffffffffffffffffffff

32位机器
php -r 'echo dechex(-1);'
输出:ffffffff

如果你想让你的代码能够移植到amd64或xeon(现在托管公司非常流行),那么你必须确保你的代码能够处理负数(以及最大值,尽管这可能不太重要)结果的不同长度。
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;
}
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>
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)));
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 );
// 转换为HEX
$out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
}

return
$out;
}

?>

示例:color_mkwebsafe('0e5c94');
输出:006699

希望这对某些人有所帮助……编码愉快。:-)
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;
}
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++;

}

?>
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());
?>
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;
}
?>
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
?>
Kory P.
11年前
或者你可以用这个来表示RGBA颜色。
toAlphaColor($n,$a) 函数
{
$rgb = substr("000000".dechex($n),-6);
$alpha = substr("00".dechex($a),-2);
return("#".$rgb.$alpha);
}
To Top