【发布时间】:2014-07-26 14:28:27
【问题描述】:
我需要将一个表示为字符串的非常大的整数转换为二进制字符串(也称为普通整数,但它总是比普通 php 整数可以容纳的更大)以有效地将其存储在数据库中并具有唯一索引它。
这个数字来自 GMP (gmp_strval()) 并且可能有不同的长度,通常在其中大约 200-300 个“字符”,所以它永远不适合 PHP 整数。这个想法是将其转换为表示整数的二进制字符串,一种大整数。我可以用 PHP 做吗?
【问题讨论】:
我需要将一个表示为字符串的非常大的整数转换为二进制字符串(也称为普通整数,但它总是比普通 php 整数可以容纳的更大)以有效地将其存储在数据库中并具有唯一索引它。
这个数字来自 GMP (gmp_strval()) 并且可能有不同的长度,通常在其中大约 200-300 个“字符”,所以它永远不适合 PHP 整数。这个想法是将其转换为表示整数的二进制字符串,一种大整数。我可以用 PHP 做吗?
【问题讨论】:
找到可以做到的 Math_BigInteger 库:
$a = new Math_BigInteger($intString);
$base256IntString = $a->toBytes();
【讨论】:
当然可以。 记住如何手动将十进制数转换为二进制数。
我为此写了一个函数
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'
也许这可以通过使用大整数库来更快地完成。
【讨论】: