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 21 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
9
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
27
Clifford dot ct at gmail dot com
13 years ago
If you use base_convert to convert a large (eg. 80-bit) hexadecimal to base-36, you might observe:

ABCDEF00001234567890 (hexadecimal) => 3O47RE02JZSW0KS8 (base-36) => ABCDEF00001240000000 (hexadecimal)

This is normal and is due to the loss of precision on large numbers.

I have written a string-based function using the built-in BC Math Extension which will overcome this and similar problems.

<?php

function str_baseconvert($str, $frombase=10, $tobase=36) {
    $str = trim($str);
    if (intval($frombase) != 10) {
        $len = strlen($str);
        $q = 0;
        for ($i=0; $i<$len; $i++) {
            $r = base_convert($str[$i], $frombase, 10);
            $q = bcadd(bcmul($q, $frombase), $r);
        }
    }
    else $q = $str;
 
    if (intval($tobase) != 10) {
        $s = '';
        while (bccomp($q, '0', 0) > 0) {
            $r = intval(bcmod($q, $tobase));
            $s = base_convert($r, 10, $tobase) . $s;
            $q = bcdiv($q, $tobase, 0);
        }
    }
    else $s = $q;
 
    return $s;
}

?>

Typical use-cases:
1.  Convert a large arbitrary precision number to base-36.
2.  Convert a 32-char hexadecimal UUID (128-bit) to a 25-char base-36 unique key, and vice versa.

Examples:

<?php
$b16 = 'ABCDEF00001234567890';
$b36 = str_baseconvert($b16, 16, 36);
echo ("$b16 (hexadecimal) = $b36 (base-36) \\n");

$uuid = 'ABCDEF01234567890123456789ABCDEF';
$ukey = str_baseconvert($uuid, 16, 36);
echo ("$uuid (hexadecimal) = $ukey (base-36) \\n");
?>

ABCDEF00001234567890 (hexadecimal) = 3o47re02jzqisvio (base-36) 
ABCDEF01234567890123456789ABCDEF (hexadecimal) = a65xa07491kf5zyfpvbo76g33 (base-36)
up
35
JR
13 years ago
Short arabic2roman conveter:

<?php
function rome($N){
        $c='IVXLCDM';
        for($a=5,$b=$s='';$N;$b++,$a^=7)
                for($o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
        return $s;
}
?>

And it works :)
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
11
Theriault
15 years ago
If you would like to convert numbers into just the uppercase alphabet base and vice-versa (e.g. the column names in a Microsoft Windows Excel sheet..A-Z, AA-ZZ, AAA-ZZZ, ...), the following functions will do this.<?php/** * Converts an integer into the alphabet base (A-Z). * * @param int $n This is the number to convert. * @return string The converted number. * @author Theriault *  */function num2alpha($n) {    $r = '';    for ($i = 1; $n >= 0 && $i < 10; $i++) {        $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;        $n -= pow(26, $i);    }    return $r;}/** * Converts an alphabetic string into an integer. * * @param int $n This is the number to convert. * @return string The converted number. * @author Theriault *  */function alpha2num($a) {    $r = 0;    $l = strlen($a);    for ($i = 0; $i < $l; $i++) {        $r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);    }    return $r - 1;}?>Microsoft Windows Excel stops at IV (255), but this function can handle much larger. However, English words will start to form after a while and some may be offensive, so be careful.
up
5
AdamJacobMuller at AdamJacobMuller dot com
21 years ago
<?php
function binarycodedstring2dec($binary) {
        $len=strlen($binary);
        $rows=($len/4)-1;
        if (($len%4)>0) {
                $pad=$len+(4-($len%4));
                $binary=str_pad($binary,$pad,"0",STR_PAD_LEFT);
                $len=strlen($binary);
                $rows=($len/4)-1;
        }
        $x=0;
        for ($x=0;$x<=$rows;$x++) {
                $s=($x*4);
                $bins=$binary[$s].$binary[$s+1].$binary[$s+2].$binary[$s+3];
                $num=base_convert($bins,2,10);
                if ($num>9) {
                        die("the string is not a proper binary coded decimal\n");
                } else {
                        $res.=$num;
                }
        }
        return $res;
}
?>

a binary coded decimal is converted by taking groups of four from a decimal string,
for example the binary coded decimal string
1000 = 8
10001000 does not = 136 but 88
so
binarycodedstring2dec(1000) = 8
binarycodedstring2dec(11100000111001)=3839
binarycodedstring2dec(100000111001)=839

i truly have no idea if this function will be useful to anyone, i simply failed a physics midterm because i didn't know this so i wrote this function to make sure i would never forget how to convert binary coded decimals
up
3
xdv43 at yandex dot ru
2 years ago
Convert Large Integer to Hexadecimal without PHP Math extension.<?php/*  * Created by Michael Renner  17-May-2006 03:24*/function baseConvert($numstring, $frombase, $tobase){     $chars = "0123456789abcdefghijklmnopqrstuvwxyz";    $tostring = substr($chars, 0, $tobase);     $length = strlen($numstring);    $result = '';    for ($i = 0; $i < $length; $i++)    {        $number[$i] = strpos($chars, $numstring[$i]);    }    do    {        $divide = 0;        $newlen = 0;        for ($i = 0; $i < $length; $i++)        {            $divide = $divide * $frombase + $number[$i];            if ($divide >= $tobase)            {                $number[$newlen++] = (int)($divide / $tobase);                $divide = $divide % $tobase;            } elseif ($newlen > 0)            {                $number[$newlen++] = 0;            }        }        $length = $newlen;        $result = $tostring[$divide] . $result;    } while ($newlen != 0);    return $result;}
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
1
tika dot pahadi at selu dot edu
9 years ago
Note that the method can only convert max 1024 long numbers. Most people don't nee that but once I ran into an issue where binary string was converted into alphanumeric. In such case, you need to split them, convert them and join.
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;
}
?>
up
2
wadelau at gmail dot com
7 years ago
Base62x gives an alternative way for traditional Base62 and/or Base64.base62x_encode / base62x_decode would be merged into PHP as an extra module in the future.Prior to that, users can download the PHP extra module via: https://github.com/wadelau/Base62x
up
1
denik dot od at gmail dot com
12 years ago
Convert any length bits to HEX:function bits2hex($bin){   $out = "";   for($i=0;$i<strlen($bin);$i+=8)   {      $byte = substr($bin,$i,8); if( strlen($byte)<8 ) $byte .= str_repeat('0',8-strlen($byte));      $out .= base_convert($byte,2,16);   }   return $out;}VARNING! If the last byte is incomplete, it is supplemented with zeros as string!
up
1
Anonymous
7 years ago
some other mini implementation of base32 without error catching. just bring things from 5 to 8 and 8 to 5 bit. greetings. mho<?function base32_decode($d)    {    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");    foreach(str_split($d) as $c)        $b = $b . sprintf("%05b", strpos($t, $c));    foreach(str_split($b, 8) as $c)        $r = $r . chr(bindec($c));    return($r);    }function base32_encode($d)    {    list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");    foreach(str_split($d) as $c)        $b = $b . sprintf("%08b", ord($c));    foreach(str_split($b, 5) as $c)        $r = $r . $t[bindec($c)];    return($r);    }?>
up
1
simon at simonster dot com
21 years ago
Here are some functions for converting integers to and from base 256. Converting to base 64 is simple given these.

<?php
function to_base256($number, $from_base = 10) {
    $binary_number = base_convert($number, $from_base, 2);
    $final_string = "";
    $new_length = (ceil(strlen($binary_number)/8)*8);
    $binary_number = str_pad($binary_number, $new_length, "0", STR_PAD_LEFT);
    for($i=($new_length-8); $i>=0; $i-=8) {
        $final_string = chr(base_convert(substr($binary_number, $i, 8), 2, 10)).$final_string;
    }
    return $final_string;
}

function from_base256($string, $to_base = 10) {
    $number = "";
    for($i=0; $i<strlen($string); $i++) {
        $number .= str_pad(base_convert(ord($string{$i}), 10, 2), 8, "0", STR_PAD_LEFT);
    }
    return base_convert($number, 2, $to_base);
}
?>

Yes, I know that this would be more efficient if it used mod instead of base_convert, but it needs to work with integers > 32 bits.
up
1
fiftytoo at buckeyeexpress dot com
21 years ago
I needed a function to invert a hex value, which i used for setting font colors when they were on a colored background, that way i will get a contrasting color.Im sure there are other reasons to use this, you decide!!<?phpfunction InvertColor($hex) {  return sprintf("%06s",base_convert(($hex ^ 0xFFFFFF),10,16));  };print '<td bgcolor="BB2222"><font color="'.InvertColor(0xBB2222).'">Blah</font></td>';// Prints 44dddd as the font color, which is it's opposite on the color wheel?>
up
1
CJ Dennis
19 years ago
Really huge numbers might be truncated at both ends.eg:<?php$binary="11010101001111010001110101000100011110010110110"."001111000010001010001111001100011010110110010010011010"."001011010000001001011111110001010101101101011010101010"."000100011101110010110010100111110001010010111010110011"."001111111100011001011011001110001111110000101011010010";print(strtoupper(base_convert($binary, 2, 16)));?>will output:9E8EA23CB63C0000000000000000000000000000000000000000000000000000 (64 hex digits)when the correct result would be:6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2 (66 hex digits)Notice that as well as the result showing '0's after B63C which you would expect it is also missing the first 6A before 9E.
up
1
tecdoc at ukr dot net
2 years ago
Addition to the method suggested by "lindsay at bitleap dot com".Easy way convert hex string to decimal string for 32-bit version of php<?php$test = '0x7000005a00000ea5';$rrrrr = gmp_strval($test);var_dump($test, $rrrrr);?>will return//string '0x7000005a00000ea5' (length=18)//string '8070450918794989221' (length=19)base_convert will return 8070450918794990488
up
1
bryan at bryanruiz dot com
14 years ago
A RFC 4648 Compliant Base32 encode.  Send me an email if you end up making this thing more efficient with bitwise operations and whatever else.<?php/** * Encode in Base32 based on RFC 4648. * Requires 20% more space than base64   * Great for case-insensitive filesystems like Windows and URL's  (except for = char which can be excluded using the pad option for urls) * * @package default * @author Bryan Ruiz **/class Base32 {   private static $map = array(        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23        'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31        '='  // padding char    );       private static $flippedMap = array(        'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',        'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',        'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',        'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'    );        /**     *    Use padding false when encoding for urls     *     * @return base32 encoded string     * @author Bryan Ruiz     **/    public static function encode($input, $padding = true) {        if(empty($input)) return "";        $input = str_split($input);        $binaryString = "";        for($i = 0; $i < count($input); $i++) {            $binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);        }        $fiveBitBinaryArray = str_split($binaryString, 5);        $base32 = "";        $i=0;        while($i < count($fiveBitBinaryArray)) {                $base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];            $i++;        }        if($padding && ($x = strlen($binaryString) % 40) != 0) {            if($x == 8) $base32 .= str_repeat(self::$map[32], 6);            else if($x == 16) $base32 .= str_repeat(self::$map[32], 4);            else if($x == 24) $base32 .= str_repeat(self::$map[32], 3);            else if($x == 32) $base32 .= self::$map[32];        }        return $base32;    }        public static function decode($input) {        if(empty($input)) return;        $paddingCharCount = substr_count($input, self::$map[32]);        $allowedValues = array(6,4,3,1,0);        if(!in_array($paddingCharCount, $allowedValues)) return false;        for($i=0; $i<4; $i++){             if($paddingCharCount == $allowedValues[$i] &&                 substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false;        }        $input = str_replace('=','', $input);        $input = str_split($input);        $binaryString = "";        for($i=0; $i < count($input); $i = $i+8) {            $x = "";            if(!in_array($input[$i], self::$map)) return false;            for($j=0; $j < 8; $j++) {                $x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);            }            $eightBits = str_split($x, 8);            for($z = 0; $z < count($eightBits); $z++) {                $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";            }        }        return $binaryString;    }}
up
0
bpds
13 years ago
A simple function to convert an int to any base.

<?php
function intToAlphaBaseN($n,$baseArray) {
    $l=count($baseArray);
    $s = '';
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
        $s =  $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
        $n -= pow($l, $i);
    }
    return $s;
}

$alpha=array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$r=rand(0, 99999999999);
echo(intToAlphaBaseN($r,$alpha));
?>
To Top