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() - Возвращает целочисленное значение переменной

Добавить

Примечания пользователей 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