(PHP 4, PHP 5, PHP 7, PHP 8)
base_convert — Преобразовывает числа между произвольными системами счисления
Возвращает в виде строки число 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
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;
}
?>While not immediately clear from the description above, a negative sign is also "silently ignored".
base_convert("-12", 10, 10) => 12If 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 );
}
?>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 678If 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;
}
?><?php
$v = base_convert(3.14, 10, 10);
var_dump($v);
?>
output: string(3) "314"