1

我有一个程序,它使用自定义基本数组将整数编码为随机的、唯一的、最多 5 个字符串。我想将该字符串解码回整数。不知道如何做到这一点。

代码:

function intToAlphaBaseN($n, $baseArray) {
 $l=count($baseArray);
 $s = '';
 for ($i = 1; $n >= 0 && $i < 6; $i++) {
  $s =  $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
  $n -= pow($l, $i);
 }
 return $s;
}

$alpha=array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7', '8', '9');
$number = 1234;
echo("Number: " . $number . " Converted: " . intToAlphaBaseN($number, $alpha)); 

输出:数字:1234 转换:afu

希望能够解码“afu”之类的东西。

4

3 回答 3

0

您可能正在重新发明世界,除此之外,您应该在寻求帮助(显示一些代码)之前向我们展示您实际上尝试实现它。

我建议阅读base_convert PHP 文档,以及文档之后的第一条评论。 http://www.php.net/manual/en/function.base-convert.php

否则,这里是基本解码的(未经测试的)实现(在看到 Jon 的评论后,我不太确定您的函数实际上是否执行基本编码):

function alphaBaseNToInt($alpha, $baseArray) {
    $result = 0;
    $l = count($baseArray);

    for ($i = strlen($alpha) - 1; $i >= 0; --$i)
        $result = $result * $l + array_search($alpha[$i], $baseArray);

    return $result;
}
于 2014-06-13T19:24:48.703 回答
0

不,您不能将字符串解码为数字,因为您不知道$nin 函数的最后一个值。

例如,最后一个数组索引是0( 'a') 和$i=strlen('afu');

0=$n % pow($l, $i) / pow($l, $i - 1)

0=$n % 39304 / 1156

$n=[0,1155]+39304*c;其中c=0,1,2,3...$n$n循环中的最后一个值。

当你找到最后一个$n值时,你可以$number通过在递减周期中求和 pow($l, $i) 来找到完整的。

和 之间的这个完整$n的地方。pow($l, 1) + pow($l, 2)pow($l, 1) + pow($l, 2) + pow($l, 3)

于 2014-06-13T19:34:53.540 回答
0

试试这个

 function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $ret = array();
        $len = mb_strlen($str, "UTF-8");
        for ($i = 0; $i < $len; $i += $l) {
            $ret[] = mb_substr($str, $i, $l, "UTF-8");
        }
        return $ret;
    }
    return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}

function intToAlphaBaseN($n,$baseArray) {
    $l=count($baseArray);
    $s = '';
    for ($i = 1; bccomp($n , 0) > 0 ; $i = bcadd($i,1)) {
        $s =  $baseArray[bcdiv(bcmod($n , bcpow($l, $i)) , bcpow($l, bcsub($i , 1)))].$s;
        $n = bcsub($n,bcmul(bcdiv(bcmod($n , bcpow($l, $i)) , bcpow($l, bcsub($i , 1))),bcpow($l, bcsub($i , 1))));
        bcadd($i,1);
    }
    return $s;
}

function alphaBaseNToInt($alpha, $baseArray) {
    $result = 0;
    $l = count($baseArray);
    $alpha = str_split_unicode($alpha,1);
    $alpha = array_reverse($alpha);
    for ($i = count($alpha) - 1; $i >= 0; $i--) {
        $result = bcadd($result, bcmul(array_search($alpha[$i],$baseArray) , bcpow($l,$i)));
    }

    return $result;
}

$alpha=array(   '0','1','2','3','4','5','6','7','8','9',
                'A','B','C','Ç','D','E','F','G','Ğ','H','I','İ','J','K','L','M','N','O','Ö','P','Q','R','S','Ş','T','U','Ü','V','W','X','Y','Z'); 


 $listmet = intToAlphaBaseN($string,$alpha);


 var_dump($listmet);

  $listmet = alphaBaseNToInt($listmet,$alpha);
 var_dump($listmet);

我使用了 bcmath 库。因为我正在处理非常非常大的数字。并将 str_split_unicode 用于特殊的土耳其字符。

于 2015-05-09T07:33:17.560 回答