修改的基地64的网址,或自定义/任意“基地”基于自定义字母表,在PHP
我搜查了四周,但筛选了很多帖子后,我没有真正看到这覆盖 -修改的基地64的网址,或自定义/任意“基地”基于自定义字母表,在PHP
我想通过提供“字母”将一个无符号的,基数为10的整数转换为更高的“自定义”基数,但我不确定从哪里开始,并且可能忽略了简单性。
作为mentioned on wikipedia,有传统的基地64的变种,不添加填充等,用于URL和什么,但我不知道如何开始实施。 我是不编码字符串或二进制数据 - 只是普通的整数 - 希望能够喂养一个任意长的“字母”到转换函数。理想情况下,我当然也可以反转数字。
我正在使用PHP,但我应该可以使用任何使用简单数学的东西,而不是很多自定义库,当然。
在这篇文章中,你可以找到一个功能,你问什么(看“创建超级压缩URL”部分):Building a URL Shortener
基本上,该函数:
- 编码整数,
- 允许您使用任何你想要的字母
而且有刚好低于;-)
谢谢!而且,你知道,当乔纳森发布这篇文章时,我很确定我阅读了这篇文章。我知道我把这些信息锁定在我的大脑中某处! – 2011-03-10 21:29:10
我记得我已经为它添加书签*(当然,关于这个主题的内容)*实际上,在我的书签快速搜索,瞧;-) – 2011-03-10 21:34:55
我coded a function to do exactly this for phunction反向功能,这里是单机版:
function Base($number, $input, $output, $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
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字符集,但可以根据需要进行更改。
使用base64有什么问题? – steveo225 2011-03-10 21:09:00
填充,而且内建的PHP'base64_encode()'不直接在整数上工作,而是将它们转换为(ASCII?)字符串。 – 2011-03-10 21:13:23