PHP:Grande número inteiro de base 10 representado como string em string binária
Pergunta
Eu preciso converter um número inteiro realmente grande que é representado como uma string em uma string binária (também conhecida como número inteiro normal, mas é sempre maior que o número inteiro php normal pode conter) para armazená-lo com eficiência no banco de dados e ter um índice exclusivo nele.
O número vem do GMP (gmp_strval()) e pode ter comprimentos diferentes, geralmente cerca de 200-300 "caracteres", portanto nunca cabe no número inteiro do PHP.A ideia é convertê-lo em uma string binária representando um número inteiro, uma espécie de número inteiro grande.Posso fazer isso com PHP?
Solução 2
Biblioteca Math_BigInteger encontrada que pode fazer isso:
$a = new Math_BigInteger($intString);
$base256IntString = $a->toBytes();
Outras dicas
Claro que você pode fazer isso.Lembre-se de como converter um número decimal em binário manualmente.
- veja se o último dígito é par (dá 0) ou ímpar (dá 1)
- subtraia o 1, se você conseguir um.
- divida por 2.Isso tem que ser feito dígito por dígito, como na escola primária :-)
- repita isso até que seu número decimal se torne zero.
Eu escrevi uma função para isso
function strMod2(array $dec)
{
return ((int)end($dec)) % 2;
}
function strDivBy2(array $dec)
{
$res = [];
$carry = 0;
if($dec[0] == '0')
array_shift($dec);
$len = count($dec);
for($i = 0; $i < $len; $i++)
{
$num = $carry*10 + ((int)$dec[$i]);
$carry = $num % 2;
$num -= $carry;
$res[] = $num / 2;
}
return $res;
}
function dec2bin_str($dec)
{
$dec_arr = str_split($dec);
$bin_arr = [];
while(count($dec_arr) > 1 || $dec_arr[0] != 0)
{
array_unshift($bin_arr, strMod2($dec_arr));
$dec_arr = strDivBy2($dec_arr);
}
return implode($bin_arr);
}
Você pode usá-lo como
echo dec2bin_str('5'); // '101'
echo dec2bin_str('146456131894613465451'); // '1111111000001111100101101000000000000010100001100010101100101101011'
Talvez isso possa ser feito mais rapidamente usando uma biblioteca para números inteiros grandes.