Java实现Base64转码为迅雷等下载链接

本文介绍如何使用Base64编码转换不同下载软件的专用链接,包括迅雷、快车及旋风等,并提供了Java实现代码。
看到很多文章上描述用Base64进行加密解密......在我看来,Base64只是一种编码方式,不让编码内容直接被人读取而已,也算不上加密的程度,我们知道Base64解码是非常容易的。百度百科:加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。 这些当然是题外话,我们以后再讨论。

在java开发过程中遇到过将下载链接转为下载软件的专用链接,这里把代码贴出来,跟大家分享。


这里用到了Sun公司提供的  javabase64-1.3.1.jar

package com.shen.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * BASE64编码
 * @author jiangsyace
 * @date 2014-07-29
 */
public class JavaBase64 {
	
	public static void main(String[] args) {
			
		String resource = "http://192.168.56.1:8080/portal2.7z";

		//迅雷的编码规则为:原地址前面加"AA",后面加"ZZ",然后进行Base64编码,最后加上迅雷下载协议"Thunder://"组成完整的下载链接
		String resourceForThunder = "Thunder://" + getBASE64("AA" + resource + "ZZ");
		//快车的编码规则:原地址前后都加上"[FLASHGET]",注意后面还要加上"&",符号怎么得出不清楚,在最后面加的是其他个人信息,至今未有人报告转换错误
		String resourceForFlashget = "Flashget://" + getBASE64("[FLASHGET]" + resource + "[FLASHGET]") + "&something";
		//旋风相对就简单多了:将原地址直接base64编码加上下载协议就好了
		String resourceForQQDownLoad = "qqdl://" + getBASE64(resource);

		System.out.println(resourceForThunder);
		System.out.println(resourceForFlashget);
		System.out.println(resourceForQQDownLoad);
		
		//解码调用getFromBASE64,注意不要将resourceForThunder直接进行解码,因为当中含有"Thunder://"等未经过编码的字符
		System.out.println("迅雷链接解码:"+getFromBASE64("QUFodHRwOi8vMTkyLjE2OC41Ni4xOjgwODAvcG9ydGFsMi43elpa"));

	}
	
	//BASE64 编码
	public static String getBASE64(String s) {
		if (s == null)
		return null;
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(s.getBytes());
		
	}

	//BASE64 解码
	public static String getFromBASE64(String s) {
		if (s == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			byte[] b = decoder.decodeBuffer(s);
			return new String(b);
		} catch (Exception e) {
			return null;
		}
	}

}

执行结果:

Thunder://QUFodHRwOi8vMTkyLjE2OC41Ni4xOjgwODAvcG9ydGFsMi43elpa
Flashget://W0ZMQVNIR0VUXWh0dHA6Ly8xOTIuMTY4LjU2LjE6ODA4MC9wb3J0YWwyLjd6W0ZMQVNIR0VUXQ==&something
qqdl://aHR0cDovLzE5Mi4xNjguNTYuMTo4MDgwL3BvcnRhbDIuN3o=
迅雷链接解码:AAhttp://192.168.56.1:8080/portal2.7zZZ

当然除了用第三方包,我们也可以自己实现,详见 http://baike.baidu.com/view/469071.htm 代码实现部分


package com.shen.utils;

import java.io.CharArrayWriter;
import java.io.IOException;

public class Base64 {
	static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
			.toCharArray();

	public static void main(String[] args) {
		
		String str = "http://192.168.56.1:8080/portal2.7z";
		str = "AA" + str + "ZZ";
		char[] ch = encode(str.getBytes());
		System.out.println("Thunder://" +new String(ch));
	}
	
	//Base64编码
	public static char[] encode(byte[] content) {
		CharArrayWriter cw = new CharArrayWriter(4 * content.length / 3);

		int idx = 0;

		int x = 0;

		for (int i = 0; i < content.length; i++) {
			if (idx == 0)
				x = (content[i] & 0xFF) << 16;
			else if (idx == 1)
				x |= (content[i] & 0xFF) << 8;
			else {
				x |= content[i] & 0xFF;
			}

			idx++;
			if (idx == 3) {
				cw.write(alphabet[(x >> 18)]);
				cw.write(alphabet[(x >> 12 & 0x3F)]);
				cw.write(alphabet[(x >> 6 & 0x3F)]);
				cw.write(alphabet[(x & 0x3F)]);

				idx = 0;
			}
		}

		if (idx == 1) {
			cw.write(alphabet[(x >> 18)]);
			cw.write(alphabet[(x >> 12 & 0x3F)]);
			cw.write(61);
			cw.write(61);
		}

		if (idx == 2) {
			cw.write(alphabet[(x >> 18)]);
			cw.write(alphabet[(x >> 12 & 0x3F)]);
			cw.write(alphabet[(x >> 6 & 0x3F)]);
			cw.write(61);
		}

		return cw.toCharArray();
	}

	//Base64解码
	public static byte[] decode(char[] message) throws IOException {
		byte[] buff = new byte[4];
		byte[] dest = new byte[message.length];

		int bpos = 0;
		int destpos = 0;

		for (int i = 0; i < message.length; i++) {
			int c = message[i];

			if ((c == 10) || (c == 13) || (c == 32) || (c == 9)) {
				continue;
			}
			if ((c >= 65) && (c <= 90))
				buff[(bpos++)] = (byte) (c - 65);
			else if ((c >= 97) && (c <= 122))
				buff[(bpos++)] = (byte) (c - 97 + 26);
			else if ((c >= 48) && (c <= 57))
				buff[(bpos++)] = (byte) (c - 48 + 52);
			else if (c == 43)
				buff[(bpos++)] = 62;
			else if (c == 47)
				buff[(bpos++)] = 63;
			else if (c == 61)
				buff[(bpos++)] = 64;
			else {
				throw new IOException("Illegal char in base64 code.");
			}

			if (bpos == 4) {
				bpos = 0;

				if (buff[0] == 64) {
					break;
				}
				if (buff[1] == 64) {
					throw new IOException("Unexpected '=' in base64 code.");
				}

				if (buff[2] == 64) {
					int v = (buff[0] & 0x3F) << 6 | buff[1] & 0x3F;
					dest[(destpos++)] = (byte) (v >> 4);
					break;
				}
				if (buff[3] == 64) {
					int v = (buff[0] & 0x3F) << 12 | (buff[1] & 0x3F) << 6
							| buff[2] & 0x3F;

					dest[(destpos++)] = (byte) (v >> 10);
					dest[(destpos++)] = (byte) (v >> 2);
					break;
				}

				int v = (buff[0] & 0x3F) << 18 | (buff[1] & 0x3F) << 12
						| (buff[2] & 0x3F) << 6 | buff[3] & 0x3F;

				dest[(destpos++)] = (byte) (v >> 16);
				dest[(destpos++)] = (byte) (v >> 8);
				dest[(destpos++)] = (byte) v;
			}

		}

		byte[] res = new byte[destpos];
		System.arraycopy(dest, 0, res, 0, destpos);

		return res;
	}
}

好了,就是这些了,希望给诸位带来一点点帮助,如有不足之处还望指正。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值