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?

Foi útil?

Solução 2

Biblioteca Math_BigInteger encontrada que pode fazer isso:

$a = new Math_BigInteger($intString);
$base256IntString = $a->toBytes();

https://github.com/pear/Math_BigInteger

Outras dicas

Claro que você pode fazer isso.Lembre-se de como converter um número decimal em binário manualmente.

  1. veja se o último dígito é par (dá 0) ou ímpar (dá 1)
  2. subtraia o 1, se você conseguir um.
  3. divida por 2.Isso tem que ser feito dígito por dígito, como na escola primária :-)
  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top