PHP Conference Fukuoka 2025

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
95
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 stringexamples 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: 173convBase('70B1D707EAC2EDF4C6389F440C7294B51FFF57BB', '0123456789ABCDEF', '01');//Convert '70B1D707EAC2EDF4C6389F440C7294B51FFF57BB' from hexadecimal (base16) to binary (base2).//result: //111000010110001110101110000011111101010110000101110//110111110100110001100011100010011111010001000000110//001110010100101001011010100011111111111110101011110//111011convBase('1324523453243154324542341524315432113200203012', '012345', '0123456789ABCDEF');//Convert '1324523453243154324542341524315432113200203012' from senary (base6) to hexadecimal (base16).//result: 1F9881BAD10454A8C23A838EF00F50convBase('355927353784509896715106760','0123456789','Christopher');//Convert '355927353784509896715106760' from decimal (base10) to undecimal (base11) using "Christopher" as the numbers.//result: iihtspiphoeCrCeshhorsrrtrhconvBase('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
6
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
8 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