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

num を基数 to_base で表した文字列を返します。 num の基数は、 from_base で指定します。 from_base および to_base は、ともに 2 から 36 までである必要があります。 10 より大きな基数を有する数の各桁は、文字 a-z で表されます。 この場合、a は 10、b は 11、z は 35 を意味します。 num は、大文字小文字を区別せずに扱います。

警告

大きな数値で base_convert() を使用すると、 精度が失われてしまうことがあります。これは、内部で使用している float の性質によるものです。詳細な情報や制限については マニュアルの浮動小数点数 のセクションを参照ください。

パラメータ

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

参考

  • intval() - 変数の整数としての値を取得する

add a note

User Contributed Notes 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