BaseConversion es una biblioteca PHP para convertir bases numéricas, similar a la función integrada de PHP base_convert()
. Sin embargo, a diferencia de la función integrada, esta biblioteca no está limitada por números enteros de 32 bits y es capaz de convertir números de precisión arbitraria. Esta biblioteca también admite la conversión de fracciones y permite una mayor personalización en términos de bases numéricas.
Para optimizar la conversión de números grandes, esta biblioteca también emplea dos estrategias de conversión diferentes. En algunos casos, es posible convertir números simplemente reemplazando los dígitos con dígitos de la otra base (por ejemplo, al convertir de base 2 a base 16). Esto es considerablemente más rápido que la otra estrategia, que simplemente calcula el nuevo número utilizando aritmética entera de precisión arbitraria.
La documentación de la API, que se puede generar utilizando Apigen, se puede leer en línea en: http://kit.riimu.net/api/baseconversion/
gmp
(solo se requiere soporte IDN) La forma más sencilla de instalar esta biblioteca es utilizar Composer para manejar sus dependencias. Para instalar esta biblioteca a través de Composer, simplemente siga estos dos pasos:
Adquiera composer.phar
ejecutando la instalación de la línea de comandos de Composer en la raíz de su proyecto.
Una vez que haya ejecutado el script de instalación, debería tener el archivo composer.phar
en la raíz de su proyecto y podrá ejecutar el siguiente comando:
php composer.phar require "riimu/kit-baseconversion:^1.2"
Después de instalar esta biblioteca a través de Composer, puede cargar la biblioteca incluyendo el archivo vendor/autoload.php
que generó Composer durante la instalación.
Si ya está familiarizado con el uso de Composer, también puede agregar la biblioteca como una dependencia agregando el siguiente archivo composer.json
a su proyecto y ejecutando el comando composer install
:
{
"require" : {
"riimu/kit-baseconversion" : " ^1.2 "
}
}
Si no desea utilizar Composer para cargar la biblioteca, también puede descargar la biblioteca manualmente descargando la última versión y extrayendo la carpeta src
a su proyecto. Luego puede incluir el archivo src/autoload.php
proporcionado para cargar las clases de la biblioteca.
La forma más conveniente de utilizar esta biblioteca es mediante el método estático baseConvert()
proporcionado por la clase BaseConverter
. En la mayoría de los casos, funciona de la misma manera que base_convert()
. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' A37334 ' , 16 , 2 ); // outputs: 101000110111001100110100
El método acepta números negativos y fracciones de la misma forma. Se puede utilizar un cuarto parámetro opcional para definir la precisión de la conversión. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 ) . PHP_EOL ; // outputs: -113863.625
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 , 1 ); // outputs: -113863.6
El método estático es simplemente un contenedor conveniente para crear una instancia de BaseConvert
y llamar a los métodos setPrecision()
y convert()
. Si necesita convertir varios números, es más eficiente llamar al objeto de forma no estática. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
$ converter = new BaseConverter ( 16 , 10 );
echo $ converter -> convert ( ' A37334 ' ) . PHP_EOL ; // outputs: 10711860
echo $ converter -> convert ( ' -1BCC7.A ' ) . PHP_EOL ; // outputs: -113863.625
$ converter -> setPrecision ( 1 );
echo $ converter -> convert ( ' -1BCC7.A ' ); // outputs: -113863.6
Si el número proporcionado contiene dígitos no válidos que no forman parte de la base numérica definida, el método devolverá falso.
Si bien esta biblioteca admite la conversión de fracciones, es importante comprender que las fracciones no siempre se pueden convertir con precisión de una base numérica a otra de la misma manera que se pueden convertir los números enteros. Esto se debe al hecho de que no todas las fracciones se pueden representar en otra base numérica.
Por ejemplo, digamos que tenemos el número 0,1 en base 3. Esto equivale a 1/3 en base 10. Sin embargo, si representaras 1/3 como un número decimal, obtendrías un '0,3333 que se repite infinitamente. ...'. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 ) . PHP_EOL ; // outputs: 0.33
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 6 ) . PHP_EOL ; // outputs: 0.333333
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 12 ); // outputs: 0.333333333333
Debido a este comportamiento, es posible establecer la precisión utilizada para conversiones de fracciones inexactas. Como se puede ver en el ejemplo anterior, el valor de precisión define el número máximo de dígitos en el número resultante. Sin embargo, el resultado puede tener menos dígitos si el número se puede convertir con precisión utilizando una pequeña cantidad de dígitos. La precisión también puede ignorarse por completo, si el convertidor sabe que puede convertir las fracciones con precisión.
El valor de precisión también tiene una definición alternativa. Si la precisión es 0 o un número negativo, entonces el número máximo de dígitos en el número resultante se basa en la precisión del número original. Si la precisión es 0, el número resultante tendrá tantos dígitos como sean necesarios para representar el número con la misma precisión que el número original. Un número negativo simplemente aumentará el número de dígitos además de eso. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , 0 ) . PHP_EOL ; // outputs: 0.652
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , - 2 ); // outputs: 0.65234
En el ejemplo anterior, el número original es 0.A7
en base 16. Un número en base 16 con dos dígitos en la parte fraccionaria puede representar un número con una precisión de 1/(16 * 16) == 1/256
. Para representar la parte fraccionaria con la misma precisión en base 10, necesitamos al menos 3 dígitos, porque dos dígitos solo pueden representar números con una precisión de 1/100
.
El valor de precisión predeterminado utilizado por la biblioteca es -1
. También es importante tener en cuenta que el último dígito no está redondeado (debido a que en algunos casos provocaría resultados inconsistentes).
Para que la interacción del usuario con la biblioteca sea más conveniente, la biblioteca trata todos los números sin distinguir entre mayúsculas y minúsculas, a menos que la base numérica lo prohíba. Por ejemplo, la base 16 se puede tratar sin distinguir entre mayúsculas y minúsculas, porque solo define el valor de los dígitos 0-9A-F
. Sin embargo, la base 62 no se puede tratar sin distinguir entre mayúsculas y minúsculas, porque letras como A
y a
tienen un valor diferente.
Los números devueltos siempre respetarán el mayúsculas y minúsculas definido por la base numérica. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7BFA11 ' , 16 , 12 ) . PHP_EOL ; // outputs: 2879B29
echo BaseConverter:: baseConvert ( ' 7bfa11 ' , 16 , 12 ); // outputs: 2879B29
Una de las características de esta biblioteca es que permite una personalización mucho mejor de las bases numéricas que base_convert()
. En la mayoría de los casos, probablemente definirás la base numérica utilizando un número entero simple como 10
o 16
. Sin embargo, no hay límite para el tamaño de ese número entero. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7F ' , 16 , 1024 ) . PHP_EOL ; // outputs: #0127
echo BaseConverter:: baseConvert ( ' 5Glm1z ' , 64 , 512 ); // outputs: #456#421#310#371
Sin embargo, para bases numéricas grandes, los dígitos se representan simplemente mediante una cadena que consta de #
y el valor del dígito. Siempre que la base numérica se define utilizando un número entero, los dígitos siguen las siguientes reglas:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
#
y el valor del dígito (la longitud de la cadena depende del valor del dígito mayor). Además de definir la base numérica utilizando un número entero, también es posible definir la base numérica utilizando una cadena. Cada carácter de la cadena representa un dígito y la posición de cada carácter representa su valor. La base 16, por ejemplo, podría definirse como 0123456789ABCDEF
. Definir bases numéricas de esta manera también facilita la obtención de números resultantes en un caso específico. Por ejemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 101100011101 ' , ' 01 ' , 16 ) . PHP_EOL ; // outputs: B1D
echo BaseConverter:: baseConvert ( ' 101100011101 ' , 2 , ' 0123456789abcdef ' ); // outputs: b1d
También existe una tercera forma de definir las bases numéricas utilizando una matriz. Esto permite una personalización aún mayor en términos de bases numéricas. Cada valor de la matriz representa un dígito y el índice indica el valor. Por ejemplo:
<?php
require ' src/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 22 ' , 10 , [ ' nil ' , ' one ' ]) . PHP_EOL ; // outputs: oneniloneonenil
echo BaseConverter:: baseConvert ( ' 187556 ' , 10 , [ ' - ' , ' -! ' , ' -" ' , ' -# ' , ' -¤ ' , ' -% ' ]); // outputs: -¤---¤-!-%-"
Esta biblioteca tiene Copyright (c) 2013-2017 Riikka Kalliomäki.
Consulte LICENCIA para obtener información sobre licencias y copias.