BaseConversion é uma biblioteca PHP para conversão de bases numéricas, semelhante à função base_convert()
integrada do PHP. No entanto, ao contrário da função integrada, esta biblioteca não é limitada por números inteiros de 32 bits e é capaz de converter números de precisão arbitrária. Esta biblioteca também suporta conversão de frações e permite mais customização em termos de bases numéricas.
Para otimizar a conversão de grandes números, esta biblioteca também emprega duas estratégias de conversão diferentes. Em alguns casos, é possível converter números simplesmente substituindo os dígitos por dígitos de outra base (por exemplo, ao converter da base 2 para a base 16). Isso é consideravelmente mais rápido do que a outra estratégia, que simplesmente calcula o novo número usando aritmética inteira de precisão arbitrária.
A documentação da API, que pode ser gerada usando Apigen, pode ser lida online em: http://kit.riimu.net/api/baseconversion/
gmp
(só é necessário suporte a IDN) A maneira mais fácil de instalar esta biblioteca é usar o Composer para lidar com suas dependências. Para instalar esta biblioteca via Composer, basta seguir estes dois passos:
Adquira o composer.phar
executando a instalação da linha de comando do Composer na raiz do seu projeto.
Depois de executar o script de instalação, você deverá ter o arquivo composer.phar
na raiz do projeto e poderá executar o seguinte comando:
php composer.phar require "riimu/kit-baseconversion:^1.2"
Após instalar esta biblioteca via Composer, você pode carregá-la incluindo o arquivo vendor/autoload.php
que foi gerado pelo Composer durante a instalação.
Se você já está familiarizado com o uso do Composer, você pode alternativamente adicionar a biblioteca como uma dependência adicionando o seguinte arquivo composer.json
ao seu projeto e executando o comando composer install
:
{
"require" : {
"riimu/kit-baseconversion" : " ^1.2 "
}
}
Se não desejar usar o Composer para carregar a biblioteca, você também pode fazer o download da biblioteca manualmente, baixando a versão mais recente e extraindo a pasta src
para o seu projeto. Você pode então incluir o arquivo src/autoload.php
fornecido para carregar as classes da biblioteca.
A maneira mais conveniente de usar esta biblioteca é através do método estático baseConvert()
fornecido pela classe BaseConverter
. Na maioria dos casos, funciona da mesma forma que base_convert()
. Por exemplo:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' A37334 ' , 16 , 2 ); // outputs: 101000110111001100110100
O método aceita números negativos e frações da mesma maneira. Um quarto parâmetro opcional pode ser usado para definir a precisão da conversão. Por exemplo:
<?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
O método estático é simplesmente um wrapper conveniente para criar uma instância de BaseConvert
e chamar os métodos setPrecision()
e convert()
. Se você precisar converter vários números, é mais eficiente chamar o objeto de maneira não estática. Por exemplo:
<?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
Se o número fornecido contiver dígitos inválidos que não fazem parte da base numérica definida, o método retornará falso.
Embora esta biblioteca suporte a conversão de frações, é importante entender que as frações nem sempre podem ser convertidas com precisão de uma base numérica para outra da mesma forma que números inteiros podem ser convertidos. Isso se deve ao fato de que nem todas as frações podem ser representadas em outra base numérica.
Por exemplo, digamos que temos o número 0,1 na base 3. Isso é igual a 1/3 na base 10. No entanto, se você representasse 1/3 como um número decimal, obteria uma repetição infinita de '0,3333. ..'. Por exemplo:
<?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
Devido a este comportamento, é possível definir a precisão utilizada para conversões de frações imprecisas. Como pode ser visto no exemplo anterior, o valor da precisão define o número máximo de dígitos no número resultante. O resultado pode ter menos dígitos, entretanto, se o número puder ser convertido com precisão usando um pequeno número de dígitos. A precisão também pode ser completamente ignorada, se o conversor souber que pode converter as frações com precisão.
O valor de precisão também possui uma definição alternativa. Se a precisão for 0 ou um número negativo, o número máximo de dígitos no número resultante será baseado na precisão do número original. Se a precisão for 0, o número resultante terá tantos dígitos quantos forem necessários para representar o número com a mesma precisão do número original. Um número negativo simplesmente aumentará o número de dígitos além disso. Por exemplo:
<?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
No exemplo anterior, o número original é 0.A7
na base 16. Um número de base 16 com dois dígitos na parte fracionária pode representar um número com precisão de 1/(16 * 16) == 1/256
. Para representar a parte fracionária com a mesma precisão na base 10, precisamos de pelo menos 3 dígitos, pois dois dígitos só podem representar números com precisão de 1/100
.
O valor de precisão padrão usado pela biblioteca é -1
. Também é importante observar que o último dígito não é arredondado (pois causaria resultados inconsistentes em alguns casos).
Para tornar a interação do usuário com a biblioteca mais conveniente, a biblioteca trata todos os números sem distinção entre maiúsculas e minúsculas, a menos que a base numérica proíba isso. Por exemplo, a base 16 pode ser tratada sem distinção entre maiúsculas e minúsculas, porque define apenas o valor dos dígitos 0-9A-F
. No entanto, a base 62 não pode ser tratada sem distinção entre maiúsculas e minúsculas, porque letras como A
e a
têm valores diferentes.
Os números retornados sempre respeitarão a caixa de caracteres definida pela base numérica. Por exemplo:
<?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
Um dos recursos desta biblioteca é que permite uma personalização muito melhor das bases numéricas do que base_convert()
. Na maioria dos casos, você provavelmente definirá a base numérica usando um número inteiro simples, como 10
ou 16
. No entanto, não há limite para o tamanho desse número inteiro. Por exemplo:
<?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
Para bases numéricas grandes, entretanto, os dígitos são simplesmente representados por uma string que consiste em #
e o valor do dígito. Sempre que a base numérica é definida usando um número inteiro, os dígitos seguem as seguintes regras:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
#
e o valor do dígito (o comprimento da string depende do maior valor do dígito). Além de definir a base numérica usando um número inteiro, também é possível definir a base numérica usando uma string. Cada caractere na string representa um dígito e a posição de cada caractere representa seu valor. A base 16, por exemplo, poderia ser definida como 0123456789ABCDEF
. Definir bases numéricas dessa maneira também facilita a obtenção de números resultantes em um caso específico. Por exemplo:
<?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
Existe também uma terceira maneira de definir as bases numéricas usando uma matriz. Isso permite uma personalização ainda maior em termos de bases numéricas. Cada valor na matriz representa um dígito e o índice indica o valor. Por exemplo:
<?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 tem Copyright (c) 2013-2017 Riikka Kalliomäki.
Consulte LICENÇA para obter informações sobre licença e cópia.