PHP:大整数基数10表示为字符串到二进制字符串

时间:2014-06-05 14:26:44

标签: php string integer bigint

我需要将一个表示为字符串的非常大的整数转换为二进制字符串(也就是普通整数,但它总是像普通的php整数一样可以容纳),以便有效地将其存储在数据库中并具有唯一索引它

该号码来自GMP(gmp_strval()),可能有不同的长度,通常约为200-300"字符"在它,所以它永远不适合PHP整数。我们的想法是将其转换为表示整数的二进制字符串,一种大整数。我可以用PHP做到吗?

2 个答案:

答案 0 :(得分:0)

当然可以这样做。 记住如何手动将十进制数转换为二进制数。

  1. 查看最后一位数是偶数(给出0)还是奇数(给1)
  2. 如果你得到1,则扣除1。
  3. 除以2.这必须像小学一样逐位完成: - )
  4. 重复此操作,直到您的十进制数变为零。
  5. 我为此写了一个函数

    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);
    }
    

    您可以将其用作

    echo dec2bin_str('5');     // '101'
    echo dec2bin_str('146456131894613465451');        // '1111111000001111100101101000000000000010100001100010101100101101011'
    

    使用大整数库可能可以更快地完成这项工作。

答案 1 :(得分:0)

找到可以执行此操作的Math_BigInteger库:

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

https://github.com/pear/Math_BigInteger