我已经四处寻找了,但经过相当多的帖子筛选后,我还没有真正看到这个问题 -
我想通过提供“字母”来将无符号的,基数为10的整数转换为更高的“自定义”基数,但我不知道从哪里开始,并且可能忽略了简单性。
作为mentioned on wikipedia,传统Base 64的变体不会添加填充等,以便在URL和什么不使用,但我不知道如何开始实现它。 8 我不编码字符串或二进制数据 - 只是简单的整数 - 而希望能够将任意长的“字母”输入转换函数。当然,理想情况下,我也可以反转这些数字。
我正在使用PHP,但我应该能够使用简单的数学而不是很多自定义库来处理任何事情。
答案 0 :(得分:1)
在这篇文章中,您可以找到一个函数来确切地询问(请参阅“创建超级压缩的URL”部分):Building a URL Shortener
基本上,这个功能:
下面有一个反向功能; - )
答案 1 :(得分:0)
我coded a function to do exactly this for phunction,这是独立版本:
function Base($number, $input, $output, $charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
if (strlen($charset) >= 2)
{
$input = max(2, min($input, strlen($charset)));
$output = max(2, min($output, strlen($charset)));
$number = ltrim(preg_replace('~[^' . preg_quote(substr($charset, 0, $input), '~') . ']+~', '', $number), $charset[0]);
if (strlen($number) > 0)
{
if ($input != 10)
{
$result = 0;
foreach (str_split(strrev($number)) as $key => $value)
{
$result += pow($input, $key) * intval(strpos($charset, $value));
}
$number = $result;
}
if ($output != 10)
{
$result = $charset[$number % $output];
while (($number = floor($number / $output)) > 0)
{
$result = $charset[$number % $output] . $result;
}
$number = $result;
}
return $number;
}
return $charset[0];
}
return false;
}
以下是如何使用它:
var_dump(Base(1000, 10, 62)); // g8
var_dump(Base('g8', 62, 10)); // 1000
var_dump(Base(14776336, 10, 62)); // 10000
var_dump(Base('10000', 62, 10)); // 14776336
默认情况下,我使用的是基本62字符集,但您可以根据自己的需要进行更改。