新浪微博的id和mid互相转换(10进制和62进制转换)

本文介绍了一种将10进制数字转换为62进制字符串的方法,并提供了一个Java实现示例。该方法适用于微博ID与短ID之间的转换,通过将长数字ID转换为更短的62进制形式来简化展示。

对于62进制,从0数到9以后,10用小写字母a表示,接着数完26个字母,到z为35,然后36为大写字母A,一直到61为大写字母Z。

public class Base62 {
	public static void main(String[] args) {
		String id = "3791648100153353"; // 3791648100153353
		String mid = Base62.encode(id);
		System.out.println("1:" + id + " ----> " + mid);
		String mid2 = "BCsbw0DTr"; // BCsbw0DTr
		String id2 = Base62.decode(mid2);
		System.out.println("2:" + id2 + " ----> " + mid2);
	}
	/*
	 * 新浪微博的id和mid互相转换(10进制和62进制转换)
	 * 在开始计算之前有必要说明一下,什么是base62编码。它实际上就是10进制和62位进制的互换。
	 * 对于62进制,从0数到9以后,
	 * 10用小写字母a表示,接着数完26个字母,到z为35,
	 * 然后36为大写字母A,一直到61为大写字母Z。
	 */
	static String[] str62key = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
			"9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
			"m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y",
			"z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
			"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y",
			"Z" };
	
	/**
	 * id转换成mid(10进制 ---> 62进制)
	 * <p> 3791648100153353 ---> BCsbw0DTr
	 * <p> 对于一个id,从后向前每7位一组,用base62编码后,拼起来即可。
	 * <br> 要注意的是:每7个一组,除了开头一组,如果得到的62进制数字不足4位,需要在前面补0。
	 */
	public static String encode(String i10) {
		String s62 = "";
		for (int j = i10.length() - 7; j > -7; j = j - 7) {// 以7个数字为一个单位进行转换
			int s = j < 0 ? 0 : j;
			int e = j + 7;
			String str = i10.substring(s, e);
			str = _10to62(Integer.valueOf(str));
			if (s > 0) {
				// 若不是第一组,则不足4位补0
				str = StringUtils.leftPad(str, 4, "0");
			}
			s62 = str + s62;
		}
		return s62;
	}
	
	/**
	 * mid转化成id的(62进制 ---> 10进制)
	 * <p> BCsbw0DTr ---> 3791648100153353
	 * <p> 对于一个mid,从后向前每4位一组,用base62解码后,拼起来即可。
	 * <br> 要注意的是:每4个一组,除了开头一组,如果得到的10进制数字不足7位,需要在前面补0。
	 */
	public static String decode(String s62) {
		String i10 = "";
		for (int i = s62.length() - 4; i > -4; i = i - 4) {// 分别以4个为一组
			int s = i < 0 ? 0 : i;
			int e = i + 4;
			String str = s62.substring(s, e);
			str = _62to10(str);// 62进制的转化成10进制的数
			if (s > 0) {
				// 若不是第一组,则不足7位补0
				str = StringUtils.leftPad(str, 7, "0");
			}
			i10 = str + i10;
		}
		return i10;
	}

	/**
	 * 62进制转换成10进制
	 */
	private static String _62to10(String str) {
		String i10 = "0";
		int c = 0;
		for (int i = 0; i < str.length(); i++) {
			int n = str.length() - i - 1;
			String s = str.substring(i, i + 1);
			for (int k = 0; k < str62key.length; k++) {
				if (s.equals(str62key[k])) {
					c += (int) (k * Math.pow(62, n));
					break;
				}
			}
			i10 = String.valueOf(c);
		}
		return i10;
	}

	/**
	 * 10进制转换成62进制
	 */
	private static String _10to62(int int10) {
		String s62 = "";
		int w = int10;
		int r = 0;
		int a = 0;
		while (w != 0) {
			r = (int) (w % 62);
			s62 = str62key[r] + s62;
			a = (int) (w / 62);
			w = (int) Math.floor(a);
		}
		return s62;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值