PHP 8.5.0 Alpha 1 available for testing

base_convert

(PHP 4, PHP 5, PHP 7, PHP 8)

base_convertConvierte un número entre bases arbitrarias

Descripción

base_convert(string $num, int $from_base, int $to_base): string

Devuelve un string que contiene el argumento num representado en la base to_base. La base de representación de number es dada por from_base. from_base y to_base deben estar comprendidos entre 2 y 36 inclusive. Los dígitos superiores a 10 de las bases superiores a 10 serán representados por las letras de A a Z, con A = 10 y Z = 35. El caso de las letras no tiene importancia, es decir num es interpretado de forma insensible al caso.

Advertencia

base_convert() perderá la precisión sobre los grandes números, debido a las propiedades internas del tipo float utilizado. Leer la sección sobre los números decimales de este manual para más información.

Parámetros

num

El número a convertir. Cualquier carácter inválido en num es ignorado silenciosamente. A partir de PHP 7.4.0 proporcionar caracteres inválidos es obsoleto.

from_base

La base num en la que está

to_base

La base en la que se debe convertir el número num

Valores devueltos

El número num convertido en la base to_base

Historial de cambios

Versión Descripción
7.4.0 Pasar caracteres inválidos generará ahora una advertencia obsoleta. El resultado siempre será calculado como si los caracteres inválidos no existieran.

Ejemplos

Ejemplo #1 Ejemplo con base_convert()

<?php
$hexadecimal
= 'a37334';
echo
base_convert($hexadecimal, 16, 2);
?>

El resultado del ejemplo sería:

101000110111001100110100

Ver también

  • intval() - Devuelve el valor entero equivalente de una variable

add a note

User Contributed Notes 6 notes

up
94
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 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;
}
?>
up
7
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
7 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