原理分析:迅雷的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 入云龙

* @date 2017年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. EXCEL将网段地址分解成明细地址

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

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

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

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

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

  7. html5将图片转换成base64的实例代码

    这篇文章给大家介绍了如何利用html5将图片转换成base64,文中通过示例代码介绍的很详细,有需要的朋友们可以参考借鉴. base64编码介绍 base64是一种网络上常用的8bit字节代码的编码方 ...

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

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

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

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

最新文章

  1. C语言位操作--不用中间变量交换两数值
  2. 数据结构(5) -- 图
  3. Jeecg-Boot 快速生成前后端代码
  4. 导出oracle11g的空表,轻松解决oracle11g 空表不能 exp 导出 的问题。
  5. linux交换区使用过多导致的性能问题
  6. STL 中的容器们 (二)
  7. 制作python模块安装包[转载自刘天斯]
  8. 远程计算机桌面图标不见了怎么办,远程桌面图标不见了怎么办
  9. 爬取人民邮电出版社书籍信息
  10. 电脑卡住了怎么保存excel_“表格保存不了怎么办“电脑卡死excel怎么保存
  11. 工具篇之Chrome浏览器所有页面崩溃(包括设置页面)的处理方法
  12. 绝对值c语言不用函数,C语言 STM32 求绝对值函数
  13. Win11保留的存储空间怎么关闭?Win11释放系统保留存储空间教程
  14. web前端入门到实战:CSS mix-blend-mode滤色screen混合模式
  15. 探秘互联网金融产品开发的技术路线图
  16. 达梦数据库和mysql索引引擎_达梦数据库如何建索引和使用
  17. java粒子特效_Java学习之粒子系统
  18. 失物招领网站html源码,基于web的失物招领系统(完整源码+论文全套+教学视频)...
  19. What?一周内咸鱼疯转2.4W次,最终被封杀!
  20. mysql里面使用技巧_MySQL的使用技巧

热门文章

  1. 泛微E-Office文件上传漏洞(CNVD-2021-49104)
  2. sketch导出html可以跳转,Sketch导入、导出功能说明及技巧
  3. Docker 部署微服务
  4. xbox one x驱动_如何在Windows,OS X和Linux上使用Xbox One控制器
  5. python视频人脸检测_OpenCV + python 实现人脸检测(基于照片和视频进行检测)
  6. 如何写好一篇伪原创文章
  7. css审查元素一直有一块html,css父元素定位后子元素审查元素位置错乱
  8. WindowsXP注册表详解
  9. 深度学习中的遥感影像数据集~持续更新
  10. 阿里云天池大数据长期赛:金融风控-贷款违约预测(含代码)