修改的基地64的网址,或自定义/任意“基地”基于自定义字母表,在PHP

问题描述:

我搜查了四周,但筛选了很多帖子后,我没有真正看到这覆盖 -修改的基地64的网址,或自定义/任意“基地”基于自定义字母表,在PHP

我想通过提供“字母”将一个无符号的,基数为10的整数转换为更高的“自定义”基数,但我不确定从哪里开始,并且可能忽略了简单性。

作为mentioned on wikipedia,有传统的基地64的变种,不添加填充等,用于URL和什么,但我不知道如何开始实施。 我是不编码字符串或二进制数据 - 只是普通的整数 - 希望能够喂养一个任意长的“字母”到转换函数。理想情况下,我当然也可以反转数字。

我正在使用PHP,但我应该可以使用任何使用简单数学的东西,而不是很多自定义库,当然。

+0

使用base64有什么问题? – steveo225 2011-03-10 21:09:00

+0

填充,而且内建的PHP'base64_encode()'不直接在整数上工作,而是将它们转换为(ASCII?)字符串。 – 2011-03-10 21:13:23

在这篇文章中,你可以找到一个功能,你问什么(看“创建超级压缩URL”部分)Building a URL Shortener

基本上,该函数:

  • 编码整数,
  • 允许您使用任何你想要的字母

而且有刚好低于;-)

+0

谢谢!而且,你知道,当乔纳森发布这篇文章时,我很确定我阅读了这篇文章。我知道我把这些信息锁定在我的大脑中某处! – 2011-03-10 21:29:10

+0

我记得我已经为它添加书签*(当然,关于这个主题的内容)*实际上,在我的书签快速搜索,瞧;-) – 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字符集,但可以根据需要进行更改。

+0

该死的,这是一个意外的投票。我实际上会赞成答案! – Leonel 2013-06-07 22:36:40

+0

@Leonel:只要你知道,你可以切换投票 - 只需点击向上箭头投票或再次点击向下箭头删除你的投票。 – 2013-06-07 23:31:27

+0

其实我不行。它说:“除非这个答案被编辑,否则你的投票现在被锁定。”对不起:( – Leonel 2013-06-09 20:21:57