base_convert

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

base_convert在任意进制之间转换数字

说明

base_convert(string $num, int $from_base, int $to_base): string

返回字符串,包含 numto_base 进制的表示。num 本身的进制由 from_base 指定。from_baseto_base 都只能在 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。字母的大小无关紧要,即 num 不区分大小写。

警告

由于使用内部的 float 类型,base_convert() 的操作可能会导致大数值中的精度丢失。请参见本手册的浮点数章节以便获得更多详细信息。

参数

num

要转换的数字。num 中的任何无效字符都会默认忽略。自 PHP 7.4.0 起,弃用使用任何无效字符。

from_base

num 的进制数

to_base

num 要转换为的进制数

返回值

num 转换为 to_base 进制

更新日志

版本 说明
7.4.0 传递任何无效字符现在将生成弃用通知。但仍会计算结果,就好像无效字符不存在一样。

示例

示例 #1 base_convert() 示例

<?php
$hexadecimal
= 'a37334';
echo
base_convert($hexadecimal, 16, 2);
?>

以上示例会输出:

101000110111001100110100

参见

添加备注

用户贡献的备注 6 notes

up
94
PHPCoder at niconet2k dot com
13 years ago
Convert an arbitrarily large number from any base to any base.

string convBase(string $numberInput, string $fromBaseInput, string $toBaseInput)
$numberInput number to convert as a string
$fromBaseInput base of the number to convert as a string
$toBaseInput base the number should be converted to as a string
examples for $fromBaseInput and $toBaseInput
'0123456789ABCDEF' for Hexadecimal (Base16)
'0123456789' for Decimal (Base10)
'01234567' for Octal (Base8)
'01' for Binary (Base2)
You can really put in whatever you want and the first character is the 0.
Examples:

<?php
convBase
('123', '0123456789', '01234567');
//Convert '123' from decimal (base10) to octal (base8).
//result: 173

convBase('70B1D707EAC2EDF4C6389F440C7294B51FFF57BB', '0123456789ABCDEF', '01');
//Convert '70B1D707EAC2EDF4C6389F440C7294B51FFF57BB' from hexadecimal (base16) to binary (base2).
//result:
//111000010110001110101110000011111101010110000101110
//110111110100110001100011100010011111010001000000110
//001110010100101001011010100011111111111110101011110
//111011

convBase('1324523453243154324542341524315432113200203012', '012345', '0123456789ABCDEF');
//Convert '1324523453243154324542341524315432113200203012' from senary (base6) to hexadecimal (base16).
//result: 1F9881BAD10454A8C23A838EF00F50

convBase('355927353784509896715106760','0123456789','Christopher');
//Convert '355927353784509896715106760' from decimal (base10) to undecimal (base11) using "Christopher" as the numbers.
//result: iihtspiphoeCrCeshhorsrrtrh

convBase('1C238Ab97132aAC84B72','0123456789aAbBcCdD', '~!@#$%^&*()');
//Convert'1C238Ab97132aAC84B72' from octodecimal (base18) using '0123456789aAbBcCdD' as the numbers to undecimal (base11) using '~!@#$%^&*()' as the numbers.
//result: !%~!!*&!~^!!&(&!~^@#@@@&

function convBase($numberInput, $fromBaseInput, $toBaseInput)
{
if (
$fromBaseInput==$toBaseInput) return $numberInput;
$fromBase = str_split($fromBaseInput,1);
$toBase = str_split($toBaseInput,1);
$number = str_split($numberInput,1);
$fromLen=strlen($fromBaseInput);
$toLen=strlen($toBaseInput);
$numberLen=strlen($numberInput);
$retval='';
if (
$toBaseInput == '0123456789')
{
$retval=0;
for (
$i = 1;$i <= $numberLen; $i++)
$retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
return
$retval;
}
if (
$fromBaseInput != '0123456789')
$base10=convBase($numberInput, $fromBaseInput, '0123456789');
else
$base10 = $numberInput;
if (
$base10<strlen($toBaseInput))
return
$toBase[$base10];
while(
$base10 != '0')
{
$retval = $toBase[bcmod($base10,$toLen)].$retval;
$base10 = bcdiv($base10,$toLen,0);
}
return
$retval;
}
?>
up
7
ardavies at tiscali dot co dot uk
11 years ago
In order to convert base 26 (hexavigesimal) of just alphanumeric characters (A-Z), wthout integers, (as descibed at http://en.wikipedia.org/wiki/Hexavigesimal), I found this to be useful:

function base_convert_alpha( $str, $from, $to )
{
$r = range( 'A', 'Z' );
$clean = str_replace( $r, array_keys($r), $str );
return base_convert( $clean, $from, $to );
}

echo base_convert_alpha( "BAC", 26, 10 );

//$clean = 102 which then returns 678
up
10
Anonymous
6 years ago
While not immediately clear from the description above, a negative sign is also "silently ignored".

base_convert("-12", 10, 10) => 12
up
15
lindsay at bitleap dot com
20 years ago
If you need to use base_convert with numbers larger then 32 bit, the following gmp implementation of base_convert should work.

<?php

/*use gmp library to convert base. gmp will convert numbers > 32bit*/
function gmp_convert($num, $base_a, $base_b)
{
return
gmp_strval ( gmp_init($num, $base_a), $base_b );
}

?>
up
2
ohcc at 163 dot com
7 years ago
<?php
$v
= base_convert(3.14, 10, 10);
var_dump($v);
?>

output: string(3) "314"
up
4
cyrilbele at yahoo dot fr
16 years ago
If you want to do sharding, at some point you will need to decide which shard to target. Here is a simple function to assign the data to a particular shard based on a key (usually identifier of the row)

Here is a simple function to get the shard based on the key and the number of shards available

<?php
function getShard($key,$nbShards) {
$num = substr(base_convert(sha1($key), 16, 10),4,6);
return
$num%$nbShards;
}
?>
To Top