最近写了新浪微博的base62的mid转换成10进制的函数,首先先解释一下这个转换有什么用。
问题提出:前端插入微博信息时使用的是10进制的mid,但是weibo文章url使用的是base62的mid,所以就需要转换:
eg:
http://weibo.com/2656274875/EAbms0SA3?from=page_1002062656274875_profile&wvr=6&mod=weibotime
base64的mid即为 EAbms0SA3
前端使用的id一般为十进制的,所以需要转换,而且其转换方法为从后向前,每四位一取。
转换为10进制的后从前往后拼接;
例如:EAbms0SA3
取得方法是
- 0SA3
- Abms
- E
依次转为
- 0209811
- 8623484
- 40
最后拼接为 4086234840209811
以下附上php实现代码,供大家参考。
<?php
class Weibo_Helper{
public static function from62to10($num){
$str62keys = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$i10 = 0;
for($i = 0; $i < strlen($num); $i++)
{
$n = strlen($num) - $i - 1;
$s = $num[$i];
$i10 += strpos($str62keys, $s) * pow(62, $n);
}
return $i10;
}
public static function weiboMid62to10($url){
$mid = "";
$length = strlen($url);
for($i = $length-4; $i>-4; $i = $i-4)
{
$offset1 = $i<0?0:$i;
$offset2 = 4;
$str = substr($url, $offset1, $offset2);
$url = substr($url, 0, $offset1);
$str = self::from62to10($str);
echo $str."<br>";
if($offset1 > 0)
{
while(strlen($str) < 7)
{
$str = '0'.$str;
}
}
$mid = $str.$mid;
echo $str."<br/>";
}
return $mid;
}
}
$url = "EAbms0SA3";
$t = Weibo_Helper::weiboMid62to10($url);
var_dump($t);
?>