我需要将一个表示为字符串的非常大的整数转换为二进制字符串(也就是普通整数,但它总是像普通的php整数一样可以容纳),以便有效地将其存储在数据库中并具有唯一索引它
该号码来自GMP(gmp_strval()),可能有不同的长度,通常约为200-300"字符"在它,所以它永远不适合PHP整数。我们的想法是将其转换为表示整数的二进制字符串,一种大整数。我可以用PHP做到吗?
答案 0 :(得分:0)
当然可以这样做。 记住如何手动将十进制数转换为二进制数。
我为此写了一个函数
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();