新浪微博mid与id互转实用工具(转)
js版
/**
* 新浪微博mid和id转换工具类
* @constructor 工具类 提供10进制和62进制转换
*/
function SinaWeiboUtility() {
/**
* 62进制字典
* @property {String}
*/
this.str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (typeof (SinaWeiboUtility._initalized) == 'undefined') {
/**
* 10进制值转换为62进制
* @param {String} int10 10进制值
* @return {String} 62进制值
*/
SinaWeiboUtility.prototype.int10to62 = function (int10) {
var s62 = '';
var r = 0;
while (int10 != 0) {
r = int10 % 62;
s62 = this.str62keys.charAt(r) + s62;
int10 = Math.floor(int10 / 62);
}
return s62;
};
/**
* 62进制值转换为10进制
* @param {String} str62 62进制值
* @return {String} 10进制值
*/
SinaWeiboUtility.prototype.str62to10 = function (str62) {
var i10 = 0;
for (var i = 0; i < str62.length; i++) {
var n = str62.length - i - 1;
var s = str62.substr(i, 1); // str62[i]; 字符串用数组方式获取,IE下不支持为“undefined”
i10 += parseInt(this.str62keys.indexOf(s)) * Math.pow(62, n);
}
return i10;
};
/**
* id转换为mid
* @param {String} id 微博id,如 "201110410216293360"
* @return {String} 微博mid,如 "wr4mOFqpbO"
*/
SinaWeiboUtility.prototype.id2mid = function (id) {
if (typeof (id) != 'string') {
return false; // id数值较大,必须为字符串!
}
var mid = '';
for (var i = id.length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
{
var offset1 = i < 0 ? 0 : i;
var offset2 = i + 7;
var num = id.substring(offset1, offset2);
num = this.int10to62(num);
mid = num + mid;
}
return mid;
};
/**
* mid转换为id
* @param {String} mid 微博mid,如 "wr4mOFqpbO"
* @return {String} 微博id,如 "201110410216293360"
*/
SinaWeiboUtility.prototype.mid2id = function (mid) {
var id = '';
for (var i = mid.length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取mid字符
{
var offset1 = i < 0 ? 0 : i;
var len = i < 0 ? parseInt(mid.length % 4) : 4;
var str = mid.substr(offset1, len);
str = this.str62to10(str).toString();
if (offset1 > 0) //若不是第一组,则不足7位补0
{
while (str.length < 7) {
str = '0' + str;
}
}
id = str + id;
}
return id;
};
/**
* 标识对象是否初始化过(将方法挂在prototype上只需执行一次即可,不必要的重复的运算。)
* @property {boolean}
*/
SinaWeiboUtility._initalized = true;
}
}
* 新浪微博mid和id转换工具类
* @constructor 工具类 提供10进制和62进制转换
*/
function SinaWeiboUtility() {
/**
* 62进制字典
* @property {String}
*/
this.str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (typeof (SinaWeiboUtility._initalized) == 'undefined') {
/**
* 10进制值转换为62进制
* @param {String} int10 10进制值
* @return {String} 62进制值
*/
SinaWeiboUtility.prototype.int10to62 = function (int10) {
var s62 = '';
var r = 0;
while (int10 != 0) {
r = int10 % 62;
s62 = this.str62keys.charAt(r) + s62;
int10 = Math.floor(int10 / 62);
}
return s62;
};
/**
* 62进制值转换为10进制
* @param {String} str62 62进制值
* @return {String} 10进制值
*/
SinaWeiboUtility.prototype.str62to10 = function (str62) {
var i10 = 0;
for (var i = 0; i < str62.length; i++) {
var n = str62.length - i - 1;
var s = str62.substr(i, 1); // str62[i]; 字符串用数组方式获取,IE下不支持为“undefined”
i10 += parseInt(this.str62keys.indexOf(s)) * Math.pow(62, n);
}
return i10;
};
/**
* id转换为mid
* @param {String} id 微博id,如 "201110410216293360"
* @return {String} 微博mid,如 "wr4mOFqpbO"
*/
SinaWeiboUtility.prototype.id2mid = function (id) {
if (typeof (id) != 'string') {
return false; // id数值较大,必须为字符串!
}
var mid = '';
for (var i = id.length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
{
var offset1 = i < 0 ? 0 : i;
var offset2 = i + 7;
var num = id.substring(offset1, offset2);
num = this.int10to62(num);
mid = num + mid;
}
return mid;
};
/**
* mid转换为id
* @param {String} mid 微博mid,如 "wr4mOFqpbO"
* @return {String} 微博id,如 "201110410216293360"
*/
SinaWeiboUtility.prototype.mid2id = function (mid) {
var id = '';
for (var i = mid.length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取mid字符
{
var offset1 = i < 0 ? 0 : i;
var len = i < 0 ? parseInt(mid.length % 4) : 4;
var str = mid.substr(offset1, len);
str = this.str62to10(str).toString();
if (offset1 > 0) //若不是第一组,则不足7位补0
{
while (str.length < 7) {
str = '0' + str;
}
}
id = str + id;
}
return id;
};
/**
* 标识对象是否初始化过(将方法挂在prototype上只需执行一次即可,不必要的重复的运算。)
* @property {boolean}
*/
SinaWeiboUtility._initalized = true;
}
}
c#版
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace SinaExportTool.Public
{
/// <summary>
/// 新浪微博mid和id转换工具类
/// </summary>
public class SinaWeiboUtility
{
/// <summary>
/// 从一条新浪微博地址中获取这条微博的id
/// </summary>
/// <param name="url">一条微博地址</param>
/// <returns>微博id</returns>
public static string GetIdFromUrl(string url)
{
string mid = GetMidFromUrl(url);
if (string.IsNullOrEmpty(mid))
{
return string.Empty;
}
else
{
return Mid2Id(mid);
}
}
/// <summary>
/// 从一条新浪微博地址中获取这条微博的mid
/// </summary>
/// <param name="url">一条微博地址</param>
/// <returns>微博mid</returns>
public static string GetMidFromUrl(string url)
{
if (string.IsNullOrEmpty(url))
{
return "";
}
if (url.IndexOf('?') != -1)
{
url = url.Substring(0, url.IndexOf('?'));
}
Regex reg = new Regex(@"^http://(e\.)?weibo\.com/[0-9a-zA-Z]+/(?<id>[0-9a-zA-Z]+)$", RegexOptions.IgnoreCase);
Match match = reg.Match(url);
if (match.Success)
{
return match.Result("${id}");
}
return "";
}
/// <summary>
/// 将新浪微博mid转换成id
/// </summary>
/// <param name="mid">微博mid</param>
/// <returns>返回微博的id</returns>
public static string Mid2Id(string mid)
{
string id = "";
for (int i = mid.Length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取URL字符
{
int offset1 = i < 0 ? 0 : i;
int len = i < 0 ? mid.Length % 4 : 4;
var str = mid.Substring(offset1, len);
str = Str62toInt(str);
if (offset1 > 0) //若不是第一组,则不足7位补0
{
while (str.Length < 7)
{
str = "0" + str;
}
}
id = str + id;
}
return id;
}
/// <summary>
/// 新浪微博id转换为mid
/// </summary>
/// <param name="id">微博id</param>
/// <returns>返回微博的mid</returns>
public static string Id2Mid(string id)
{
string mid = "", strTemp;
int startIdex, len;
for (var i = id.Length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
{
startIdex = i < 0 ? 0 : i;
len = i < 0 ? id.Length % 7 : 7;
strTemp = id.Substring(startIdex, len);
mid = IntToStr62(Convert.ToInt32(strTemp)) + mid;
}
return mid;
}
//62进制转成10进制
public static string Str62toInt(string str62)
{
Int64 i64 = 0;
for (int i = 0; i < str62.Length; i++)
{
Int64 Vi = (Int64)Math.Pow(62, (str62.Length - i - 1));
char t = str62[i];
i64 += Vi * GetInt10(t.ToString());
}
return i64.ToString();
}
//10进制转成62进制
public static string IntToStr62(int int10)
{
string s62 = "";
int r = 0;
while (int10 != 0)
{
r = int10 % 62;
s62 = Get62key(r) + s62;
int10 = int10 / 62;
}
return s62;
}
// 62进制字典
private static string str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVTXYZ";
//获取key对应的62进制整数
private static Int64 GetInt10(string key)
{
return str62keys.IndexOf(key);
}
//获取62进制整数对应的key
private static string Get62key(int int10)
{
if (int10 < 0 || int10 > 61)
return "";
return str62keys.Substring(int10, 1);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace SinaExportTool.Public
{
/// <summary>
/// 新浪微博mid和id转换工具类
/// </summary>
public class SinaWeiboUtility
{
/// <summary>
/// 从一条新浪微博地址中获取这条微博的id
/// </summary>
/// <param name="url">一条微博地址</param>
/// <returns>微博id</returns>
public static string GetIdFromUrl(string url)
{
string mid = GetMidFromUrl(url);
if (string.IsNullOrEmpty(mid))
{
return string.Empty;
}
else
{
return Mid2Id(mid);
}
}
/// <summary>
/// 从一条新浪微博地址中获取这条微博的mid
/// </summary>
/// <param name="url">一条微博地址</param>
/// <returns>微博mid</returns>
public static string GetMidFromUrl(string url)
{
if (string.IsNullOrEmpty(url))
{
return "";
}
if (url.IndexOf('?') != -1)
{
url = url.Substring(0, url.IndexOf('?'));
}
Regex reg = new Regex(@"^http://(e\.)?weibo\.com/[0-9a-zA-Z]+/(?<id>[0-9a-zA-Z]+)$", RegexOptions.IgnoreCase);
Match match = reg.Match(url);
if (match.Success)
{
return match.Result("${id}");
}
return "";
}
/// <summary>
/// 将新浪微博mid转换成id
/// </summary>
/// <param name="mid">微博mid</param>
/// <returns>返回微博的id</returns>
public static string Mid2Id(string mid)
{
string id = "";
for (int i = mid.Length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取URL字符
{
int offset1 = i < 0 ? 0 : i;
int len = i < 0 ? mid.Length % 4 : 4;
var str = mid.Substring(offset1, len);
str = Str62toInt(str);
if (offset1 > 0) //若不是第一组,则不足7位补0
{
while (str.Length < 7)
{
str = "0" + str;
}
}
id = str + id;
}
return id;
}
/// <summary>
/// 新浪微博id转换为mid
/// </summary>
/// <param name="id">微博id</param>
/// <returns>返回微博的mid</returns>
public static string Id2Mid(string id)
{
string mid = "", strTemp;
int startIdex, len;
for (var i = id.Length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
{
startIdex = i < 0 ? 0 : i;
len = i < 0 ? id.Length % 7 : 7;
strTemp = id.Substring(startIdex, len);
mid = IntToStr62(Convert.ToInt32(strTemp)) + mid;
}
return mid;
}
//62进制转成10进制
public static string Str62toInt(string str62)
{
Int64 i64 = 0;
for (int i = 0; i < str62.Length; i++)
{
Int64 Vi = (Int64)Math.Pow(62, (str62.Length - i - 1));
char t = str62[i];
i64 += Vi * GetInt10(t.ToString());
}
return i64.ToString();
}
//10进制转成62进制
public static string IntToStr62(int int10)
{
string s62 = "";
int r = 0;
while (int10 != 0)
{
r = int10 % 62;
s62 = Get62key(r) + s62;
int10 = int10 / 62;
}
return s62;
}
// 62进制字典
private static string str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVTXYZ";
//获取key对应的62进制整数
private static Int64 GetInt10(string key)
{
return str62keys.IndexOf(key);
}
//获取62进制整数对应的key
private static string Get62key(int int10)
{
if (int10 < 0 || int10 > 61)
return "";
return str62keys.Substring(int10, 1);
}
}
}