Java解析磁力链(Magnet URI)的完整指南

Java解析磁力链(Magnet URI)的完整指南

磁力链(Magnet URI)是一种常见的P2P文件共享链接格式。下面我将详细介绍如何在Java中解析磁力链的各个组成部分。

1. 理解磁力链的结构

一个典型的磁力链接(Magnet URI)格式如下:

magnet:?xt=urn:btih:哈希值&dn=显示名称&tr=Tracker地址&...

磁力链接是一种基于内容寻址的超链接协议,主要用于P2P文件共享。其组成部分通过"&"符号连接,每个参数都有特定的功能:

  1. xt (eXact Topic):
    • 核心标识符,使用URN(统一资源名称)格式
    • 最常见的格式是"urn:btih:"后接40个字符的SHA-1哈希值
    • 示例:xt=urn:btih:9C1E05D471B855A4A1F1E1F7A5B5E3E7E8E9EA0
  2. dn (Display Name):
    • 人类可读的文件名显示
    • 支持多语言,需进行URL编码
    • 示例:dn=Ubuntu+20.04+Desktop.iso
  3. tr (Tracker):
    • 可选的Tracker服务器地址
    • 可包含多个Tracker,每个用"&tr="分隔
    • 示例:tr=udp://tracker.opentrackr.org:1337/announce
  4. xl (eXact Length):
    • 精确的文件大小(字节)
    • 有助于预先分配磁盘空间
    • 示例:xl=2796554240
  5. as (Acceptable Source):
    • 指定可接受的备用源URI
    • 可以是HTTP/FTP等其他下载源
    • 示例:as=http://mirror.example.com/ubuntu.iso
  6. xs (eXact Source):
    • 直接资源链接
    • 通常用于补充P2P下载
    • 示例:xs=http://cdn.example.com/file.ext

附加说明:

  • 参数顺序不影响功能
  • 所有非ASCII字符需进行百分比编码
  • 现代客户端还支持ws (WebSocket)等新参数
  • 哈希算法除了SHA-1,也可支持MD5、SHA-256等

实际应用示例: magnet:?xt=urn:btih:9C1E05D471B855A4A1F1E1F7A5B5E3E7E8E9EA0&dn=Ubuntu+20.04&tr=udp://tracker.opentrackr.org:1337&xl=2796554240&as=http://releases.ubuntu.com/20.04/ubuntu-20.04-desktop-amd64.iso

2. Java解析磁力链的核心代码

2.1 使用URI类解析

import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; public class MagnetParser { public static Map<String, String> parseMagnetLink(String magnetLink) throws URISyntaxException { Map<String, String> params = new HashMap<>(); URI uri = new URI(magnetLink); String query = uri.getRawQuery(); if (query != null) { String[] pairs = query.split("&"); for (String pair : pairs) { int idx = pair.indexOf("="); String key = idx > 0 ? pair.substring(0, idx) : pair; String value = idx > 0 && pair.length() > idx + 1 ? pair.substring(idx + 1) : ""; params.put(key, value); } } return params; } } 

2.2 使用URLDecoder处理编码

import java.io.UnsupportedEncodingException; import java.net.URLDecoder; // 在上述parseMagnetLink方法中添加解码处理 try { value = URLDecoder.decode(value, "UTF-8"); } catch (UnsupportedEncodingException e) { // 保持原始值 } 

3. 完整示例代码

import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; public class MagnetParserDemo { public static void main(String[] args) { String magnetLink = "magnet:?xt=urn:btih:1a2b3c4d5e6f7g8h9i0j&dn=example+file.mp4&tr=udp%3A%2F%2Ftracker.example.com%3A6969"; try { Map<String, String> result = parseMagnetLink(magnetLink); System.out.println("磁力链解析结果:"); System.out.println("哈希值: " + extractHash(result.get("xt"))); System.out.println("文件名: " + result.get("dn")); System.out.println("Tracker: " + result.get("tr")); System.out.println("文件大小: " + (result.containsKey("xl") ? formatSize(result.get("xl")) : "未知")); } catch (URISyntaxException e) { System.err.println("无效的磁力链格式: " + e.getMessage()); } } private static String extractHash(String xt) { if (xt == null) return null; // 从xt值中提取哈希部分,如"urn:btih:1a2b3c..." return xt.substring(xt.lastIndexOf(':') + 1); } private static String formatSize(String xl) { try { long bytes = Long.parseLong(xl); if (bytes < 1024) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(1024)); String pre = "KMGTPE".charAt(exp-1) + "i"; return String.format("%.1f %sB", bytes / Math.pow(1024, exp), pre); } catch (NumberFormatException e) { return xl + " B"; } } public static Map<String, String> parseMagnetLink(String magnetLink) throws URISyntaxException { // 同上文parseMagnetLink方法实现 // ... } } 

4. 实际应用场景

  1. BT客户端开发:解析磁力链获取文件哈希和Tracker地址
  2. 下载管理器:识别磁力链并启动相应下载协议
  3. 资源搜索工具:从磁力链中提取关键信息建立索引
  4. 文件校验工具:通过btih哈希验证文件完整性

5. 注意事项

磁力链(Magnet URI)中的参数排列具有灵活性,其核心特征包括:

  1. 参数顺序可变性
  • 各参数间用"&"符号连接,但排列顺序不影响功能
  • 例如"magnet:?xt=...&dn=..."和"magnet:?dn=...&xt=..."是等效的
  • 这种设计增强了协议的兼容性
  1. 参数重复机制
  • 关键参数允许重复出现,特别是Tracker服务器地址
  • 典型应用场景:多个备用Tracker时形如"tr=udp://tracker1&tr=udp://tracker2"
  • 客户端应支持解析所有重复参数值
  1. 编码处理要求
  • 参数值可能包含特殊字符,需遵循RFC 3986的百分号编码规则
  • 常见需要解码的字符:空格(%20)、冒号(%3A)、斜杠(%2F)等
  • 实现时必须先解码再使用参数值
  1. 哈希值多样性
  • 主标识符(xt参数)支持多种哈希类型:
    • 40字符的SHA-1哈希(URN格式:urn:sha1:)
    • 32字符的Base32编码(URN格式:urn:btih:)
    • 部分客户端还支持MD5等其他哈希算法
  • 示例对比:
    • SHA-1:urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C
    • Base32:urn:btih:QJZ5VWQ6KJNHVZ5FWAH5Q5PX6KJNHVZ5
  1. 扩展性考虑
  • 协议保留未知参数的处理机制
  • 新参数应使用x.前缀(如x.foo=bar)
  • 客户端应忽略无法识别的参数而不报错

6. 扩展功能

如果需要更复杂的解析,可以考虑:

  1. 处理多个Tracker地址
List<String> trackers = new ArrayList<>(); for (Map.Entry<String, String> entry : params.entrySet()) { if (entry.getKey().startsWith("tr")) { trackers.add(entry.getValue()); } } 

  1. 解析Web种子(ws参数)
  2. 处理Peer地址(pe参数)
  3. 支持更多哈希类型(MD5, SHA-256等)

通过以上方法,您可以轻松地在Java应用程序中解析和处理磁力链信息。

Read more

FPGA入门:CAN总线原理与Verilog代码详解

FPGA入门:CAN总线原理与Verilog代码详解

目录 一、CAN 总线核心原理 1. 物理层特性 2. 协议层核心概念 (1)位时序 (2)帧结构(标准数据帧) (3)关键机制 二、FPGA 实现 CAN 的核心模块 三、Verilog 代码实现(以 50MHz 时钟、1Mbps 波特率为例) 1. 全局参数定义 2. 位时序模块(CAN Bit Timing Generator) 3. CRC 计算模块(CAN CRC Generator) 4. 发送模块(CAN Transmitter) 5. 接收模块(CAN Receiver)

By Ne0inhk
汇川机器人软件RobotLab常规操作

汇川机器人软件RobotLab常规操作

一.权限管理注意事项 1.1 软件登录权限管理 连接上软件后,修改轴参数、点位数据需要权限。点击人物图标,登录对应的权限,管理员权限登录密码6个0。 1.2机器人控制权限管理 点击“锁”,打开机器人控制权配置页面。 选择“InoRoboLabt”,机器人受编程软件控制,使用软件可手动移动点位、示教位置信息。 选择“远程IO单元”,机器人受外部设备控制如PLC、上位机,机器人进入自动模式,收到交互信号就按照程序执行。 选择“远程以太网客户端”,机器人受远程客户短控制,用于查找问题、远程调试。 二、 使用过渡点注意事项 程序中点到点直线运动会有机构干涉或有安全风险时,使用过渡点在运动规避风险。 使用过渡点时,注意指令的工具坐标系,选择正确的Wobj工具好,否则运动出错有撞机风险。 如下图所示为例,wobj0为A工位,wobj1为B工位,注意在“轴控制面板”中选择对应工具坐标号 三、使用全局点位移动注意事项 双击左侧“P.

By Ne0inhk
Formality:原语(primitive)的概念

Formality:原语(primitive)的概念

相关阅读 Formalityhttps://blog.ZEEKLOG.net/weixin_45791458/category_12841971.html?spm=1001.2014.3001.5482         原语(primitive)一般指的是语言内置的基本构件,它们代表了基本的逻辑门和构件,通常用于建模电路的基本功能,例如Verilog中的门级建模会使用and、or等关键词表示单元门。Formality也存在原语的概念,这一般出现在对门级网表进行建模时,本文将对此进行详细解释。         假设以例1所示的RTL代码作为参考设计(可以看出添加了// synopsys sync_set_reset综合指令让Design Compiler将其实现为带同步复位端的D触发器),例2所示的综合后网表作为实现设计,其中data_out_reg原语是一个带同步复位端的D触发器(FDS2)。 // 例1 module ref( input clk, input reset, input data_in, output reg data_

By Ne0inhk
DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 目录 DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 前  言 1 环境准备 1.1 华为云开发环境 1.2 ModelArts 代金券与模型服务 1.3 启动 OpenClaw 网关 2 飞书开放平台配置 2.1 创建企业自建应用 2.2 添加机器人能力 2.3 配置应用权限 2.4 发布应用版本 3 OpenClaw 与飞书集成 3.1 配置 OpenClaw

By Ne0inhk