原理分析:迅雷的thunder://地址就是将普通url地址加前缀‘AA’、后缀‘ZZ’,再base64编码后得到的字符串

实现:

步骤1,添加工具类Base64 编码和解码:Base64.java

package th;

import java.io.*;

/**

* Base64 编码和解码。

*

* @author 宋立君

* @date 2014年07月03日

*/

public class Base64 {

public Base64() {

}

/**

* 功能:编码字符串

*

* @author 宋立君

* @date 2014年07月03日

* @param data

* 源字符串

* @return String

*/

public static String encode(String data) {

return new String(encode(data.getBytes()));

}

/**

* 功能:解码字符串

*

* @author 宋立君

* @date 2014年07月03日

* @param data

* 源字符串

* @return String

*/

public static String decode(String data) {

return new String(decode(data.toCharArray()));

}

/**

* 功能:编码byte[]

*

* @author 宋立君

* @date 2014年07月03日

* @param data

* 源

* @return char[]

*/

public static char[] encode(byte[] data) {

char[] out = new char[((data.length + 2) / 3) * 4];

for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {

boolean quad = false;

boolean trip = false;

int val = (0xFF & (int) data[i]);

val <<= 8;

if ((i + 1) < data.length) {

val |= (0xFF & (int) data[i + 1]);

trip = true;

}

val <<= 8;

if ((i + 2) < data.length) {

val |= (0xFF & (int) data[i + 2]);

quad = true;

}

out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];

val >>= 6;

out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];

val >>= 6;

out[index + 1] = alphabet[val & 0x3F];

val >>= 6;

out[index + 0] = alphabet[val & 0x3F];

}

return out;

}

/**

* 功能:解码

*

* @author 宋立君

* @date 2014年07月03日

* @param data

* 编码后的字符数组

* @return byte[]

*/

public static byte[] decode(char[] data) {

int tempLen = data.length;

for (int ix = 0; ix < data.length; ix++) {

if ((data[ix] > 255) || codes[data[ix]] < 0) {

--tempLen; // ignore non-valid chars and padding

}

}

// calculate required length:

// -- 3 bytes for every 4 valid base64 chars

// -- plus 2 bytes if there are 3 extra base64 chars,

// or plus 1 byte if there are 2 extra.

int len = (tempLen / 4) * 3;

if ((tempLen % 4) == 3) {

len += 2;

}

if ((tempLen % 4) == 2) {

len += 1;

}

byte[] out = new byte[len];

int shift = 0; // # of excess bits stored in accum

int accum = 0; // excess bits

int index = 0;

// we now go through the entire array (NOT using the 'tempLen' value)

for (int ix = 0; ix < data.length; ix++) {

int value = (data[ix] > 255) ? -1 : codes[data[ix]];

if (value >= 0) { // skip over non-code

accum <<= 6; // bits shift up by 6 each time thru

shift += 6; // loop, with new bits being put in

accum |= value; // at the bottom.

if (shift >= 8) { // whenever there are 8 or more shifted in,

shift -= 8; // write them out (from the top, leaving any

out[index++] = // excess at the bottom for next iteration.

(byte) ((accum >> shift) & 0xff);

}

}

}

// if there is STILL something wrong we just have to throw up now!

if (index != out.length) {

throw new Error("Miscalculated data length (wrote " + index

+ " instead of " + out.length + ")");

}

return out;

}

/**

* 功能:编码文件

*

* @author 宋立君

* @date 2014年07月03日

* @param file

* 源文件

*/

public static void encode(File file) throws IOException {

if (!file.exists()) {

System.exit(0);

}

else {

byte[] decoded = readBytes(file);

char[] encoded = encode(decoded);

writeChars(file, encoded);

}

file = null;

}

/**

* 功能:解码文件。

*

* @author 宋立君

* @date 2014年07月03日

* @param file

* 源文件

* @throws IOException

*/

public static void decode(File file) throws IOException {

if (!file.exists()) {

System.exit(0);

} else {

char[] encoded = readChars(file);

byte[] decoded = decode(encoded);

writeBytes(file, decoded);

}

file = null;

}

//

// code characters for values 0..63

//

private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

.toCharArray();

//

// lookup table for converting base64 characters to value in range 0..63

//

private static byte[] codes = new byte[256];

static {

for (int i = 0; i < 256; i++) {

codes[i] = -1;

// LoggerUtil.debug(i + "&" + codes[i] + " ");

}

for (int i = 'A'; i <= 'Z'; i++) {

codes[i] = (byte) (i - 'A');

// LoggerUtil.debug(i + "&" + codes[i] + " ");

}

for (int i = 'a'; i <= 'z'; i++) {

codes[i] = (byte) (26 + i - 'a');

// LoggerUtil.debug(i + "&" + codes[i] + " ");

}

for (int i = '0'; i <= '9'; i++) {

codes[i] = (byte) (52 + i - '0');

// LoggerUtil.debug(i + "&" + codes[i] + " ");

}

codes['+'] = 62;

codes['/'] = 63;

}

private static byte[] readBytes(File file) throws IOException {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] b = null;

InputStream fis = null;

InputStream is = null;

try {

fis = new FileInputStream(file);

is = new BufferedInputStream(fis);

int count = 0;

byte[] buf = new byte[16384];

while ((count = is.read(buf)) != -1) {

if (count > 0) {

baos.write(buf, 0, count);

}

}

b = baos.toByteArray();

} finally {

try {

if (fis != null)

fis.close();

if (is != null)

is.close();

if (baos != null)

baos.close();

} catch (Exception e) {

System.out.println(e);

}

}

return b;

}

private static char[] readChars(File file) throws IOException {

CharArrayWriter caw = new CharArrayWriter();

Reader fr = null;

Reader in = null;

try {

fr = new FileReader(file);

in = new BufferedReader(fr);

int count = 0;

char[] buf = new char[16384];

while ((count = in.read(buf)) != -1) {

if (count > 0) {

caw.write(buf, 0, count);

}

}

} finally {

try {

if (caw != null)

caw.close();

if (in != null)

in.close();

if (fr != null)

fr.close();

} catch (Exception e) {

System.out.println(e);

}

}

return caw.toCharArray();

}

private static void writeBytes(File file, byte[] data) throws IOException {

OutputStream fos = null;

OutputStream os = null;

try {

fos = new FileOutputStream(file);

os = new BufferedOutputStream(fos);

os.write(data);

} finally {

try {

if (os != null)

os.close();

if (fos != null)

fos.close();

} catch (Exception e) {

System.out.println(e);

}

}

}

private static void writeChars(File file, char[] data) throws IOException {

Writer fos = null;

Writer os = null;

try {

fos = new FileWriter(file);

os = new BufferedWriter(fos);

os.write(data);

} finally {

try {

if (os != null)

os.close();

if (fos != null)

fos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

步骤2,编写迅雷地址转普通地址的类及方法:ThunderSiteConverUtil.java

package th;

/**

* 迅雷地址转普通地址

*

Title: ThunderSiteConverUtil

*

Description:

*

Company: www.itcast.com

* @author入云龙

* @date2017年3月6日下午2:11:32

* @version 1.0

*/

public class ThunderSiteConverUtil {

/**

* 迅雷thunder://地址与普通url地址转换

其实迅雷的thunder://地址就是将普通url地址加前缀‘AA’、后缀‘ZZ’,再base64编码后得到的字符串

*

Title: t1

*

Description:

* @param url

* @return

*/

public String conver(String url){

String newUrl="";

//s=s.substring(int begin,int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;

//去掉迅雷地址前缀

url=url.substring(10, url.length());

//解密

newUrl=Base64.decode(url);

//去掉头AA,尾ZZ

newUrl=newUrl.substring(2, newUrl.length()-2);

return newUrl;

}

}

步骤3,建立测试类:TestTh.java

package th;

import org.junit.Test;

/*

* 迅雷地址转普通地址测试

*/

public class TestTh {

@Test

public void test1(){

String url="thunder://QUFodHRwOi8vdG9vbC5sdS90ZXN0LnppcFpa";

System.out.println("迅雷地址:"+url);

url=new ThunderSiteConverUtil().conver(url);

System.out.println("普通地址:"+url);

}

}

运行Junit测试test1,控制台输出:

迅雷地址:thunder://QUFodHRwOi8vdG9vbC5sdS90ZXN0LnppcFpa

普通地址:http://tool.lu/test.zip

迅雷java_Java实现迅雷地址转成普通地址相关推荐

  1. 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。

    详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程. first() {//检索快表if(找到){修改页表项访问位if(是写指令){修改位置为"1";}us ...

  2. 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。...

    详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程. first() {//检索快表if(找到){修改页表项访问位if(是写指令){修改位置为"1";}us ...

  3. 迅雷 java_Java实现迅雷地址转成普通地址实例代码

    原理分析:迅雷的thunder://地址就是将普通url地址加前缀'AA'.后缀'ZZ',再base64编码后得到的字符串 实现: 步骤1,添加工具类Base64 编码和解码:Base64.java ...

  4. 迅雷 java_Java实现迅雷地址转成普通地址

    原理分析:迅雷的thunder://地址就是将普通url地址加前缀'AA'.后缀'ZZ',再base64编码后得到的字符串 实现: 步骤1,添加工具类Base64 编码和解码:Base64.java ...

  5. EXCEL将网段地址分解成明细地址

    如图,将图1中四个网段地址分解成图2中的明细地址 图1 网段地址  图2 明细地址 一.将网段地址分解 图3 分解网段地址 网络地址公式为 B2=left(A2,len(A2)-3) 掩码位数公式为 ...

  6. 迅雷java_Java 仿迅雷多线程下载

    packagenet.webjoy.jackluo.android_json;/*** 1.http Range "bytes="+ start+end * 2.RandomAcc ...

  7. linux 读取内存颗粒,Linux虚拟内存地址转化成物理内存地址

    背景 现代手机这种SOC(system on chip),因为功耗.Modem等功能soc上集成了很多core,他们还可以是独立的系统在运转. 比如ADSP简介ADSP(Application Dig ...

  8. 如何将域名地址转换成对应的IP地址?

    本文摘自:http://blog.163.com/lyzaily@126/blog/static/42438837200910173105834/ 将域名地址转换成IP地址有一个好处,就是我们的服务器 ...

  9. 为什么有了IP地址还要有MAC地址??

    在计算机网络中,要资源共享,有条不紊的交换数据,就要遵守一些大家事先约定好的规则,这些为进行网络中的数据交换而建立的规则标准或约定称为网路协议简称协议.为了使计算机之间能够高效的传输就采用了分层,就像 ...

  10. C# IP地址和整数之间的转换,IP地址和数字ip地址的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

最新文章

  1. 数学分析原理 定理 6.4
  2. xilinx sg dma 注意事项
  3. xcode 自带的git工具创建项目流程
  4. iOS - UIButton 开发总结
  5. 百万年薪程序员必会的五种技术
  6. 完全卸载sql2005(试了以后很成功,收录下来,分享给大家)
  7. OpenCV与图像处理学习十三——Harris角点检测(含代码)
  8. ZZULIJ 1129: 第几天
  9. nvidia TX2 CUDA yolov5环境搭建
  10. sql并行度_SQL Server最大并行度的重要性
  11. hadoop yarn 获取日志_Hadoop YARN日志查看方式
  12. java导出sas_[转载]SAS Proc Export导出文件
  13. 拆分SharePoint 2013 中CreatedModifiedInfo 的时间
  14. Python实现基于TF-IDF抽取文本数据关键词
  15. C++学习之 delete 构造器
  16. linux解压缩命令 gz,linux的gz解压缩命令是什么
  17. 免费的虚拟主机 000webhost
  18. mysql源码分析——InnoDB引擎启动分析
  19. 集成驱动器LMG3411R150RWHR GaN FET(LMG3410R150RWHR)
  20. 我的世界java免费云电脑,云电脑app下载_云电脑官方版下载-我的世界中文网

热门文章

  1. 【优化预测】基于matlab粒子群算法优化SVM预测【含Matlab源码 1424期】
  2. 【优化算法】混合增强灰狼优化布谷鸟搜索算法(AGWOCS)【含Matlab源码 1331期】
  3. 【图像融合】基于matlab图像融合评价指标【含Matlab源码 789期】
  4. 【通信】基于matlab GUI短波通信系统仿真【含Matlab源码 647期】
  5. 【电路仿真】基于matlab simulink三相桥式全控整流电路【含Matlab源码 332期】
  6. element ui后台html_Github上10 个优秀的后台控制面板
  7. node-red 可视化_可视化与注意-第1部分
  8. c语言程序设计怎么改卷,C语言程序设计(B卷)教程.doc
  9. python:numpy.random.shuffle打乱顺序函数
  10. php-fpm stop,php-fpm 启动,重启,终止操作