跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 解析磁力链(Magnet URI)详解

磁力链(Magnet URI)的结构及其在 Java 中的解析方法。详细说明了 xt、dn、tr 等参数的含义,提供了基于 URI 类和 URLDecoder 的核心代码及完整示例。内容涵盖实际应用场景、参数灵活性、编码处理要求及扩展功能,帮助开发者在 BT 客户端或下载管理器中实现磁力链信息的提取与校验。

GRACE Grace发布于 2026/3/30更新于 2026/9/988 浏览
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;

   {
      Map<String, String>   URISyntaxException {
        Map<String, String> params =  <>();
            (magnetLink);
           uri.getRawQuery();
         (query != ) {
            String[] pairs = query.split();
             (String pair : pairs) {
                   pair.indexOf();
                   idx >  ? pair.substring(, idx) : pair;
                   idx >  && pair.length() > idx +  ? pair.substring(idx + ) : ;
                params.put(key, value);
            }
        }
         params;
    }
}
public
class
MagnetParser
public
static
parseMagnetLink
(String magnetLink)
throws
new
HashMap
URI
uri
=
new
URI
String
query
=
if
null
"&"
for
int
idx
=
"="
String
key
=
0
0
String
value
=
0
1
1
""
return
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 方法实现
        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;
    }
}

4. 实际应用场景

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

5. 注意事项

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

  1. 参数顺序可变性

    • 各参数间用"&"符号连接,但排列顺序不影响功能
    • 例如"magnet:?xt=...&dn=..."和"magnet:?dn=...&xt=..."是等效的
    • 这种设计增强了协议的兼容性
  2. 参数重复机制

    • 关键参数允许重复出现,特别是 Tracker 服务器地址
    • 典型应用场景:多个备用 Tracker 时形如"tr=udp://tracker1&tr=udp://tracker2"
    • 客户端应支持解析所有重复参数值
  3. 编码处理要求

    • 参数值可能包含特殊字符,需遵循 RFC 3986 的百分号编码规则
    • 常见需要解码的字符:空格 (%20)、冒号 (%3A)、斜杠 (%2F) 等
    • 实现时必须先解码再使用参数值
  4. 哈希值多样性

    • 主标识符 (xt 参数) 支持多种哈希类型:
      • 40 字符的 SHA-1 哈希 (URN 格式:urn:sha1:)
      • 32 字符的 Base32 编码 (URN 格式:urn:btih:)
      • 部分客户端还支持 MD5 等其他哈希算法
    • 示例对比:
      • SHA-1:urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C
      • Base32:urn:btih:QJZ5VWQ6KJNHVZ5FWAH5Q5PX6KJNHVZ5
  5. 扩展性考虑

    • 协议保留未知参数的处理机制
    • 新参数应使用 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 应用程序中解析和处理磁力链信息。

目录

  1. Java 解析磁力链(Magnet URI)详解
  2. 1. 理解磁力链的结构
  3. 2. Java 解析磁力链的核心代码
  4. 2.1 使用 URI 类解析
  5. 2.2 使用 URLDecoder 处理编码
  6. 3. 完整示例代码
  7. 4. 实际应用场景
  8. 5. 注意事项
  9. 6. 扩展功能

更多推荐文章

查看全部
  • Qwen3-TTS 多语种语音合成实战:Python API 调用与 WebUI 使用指南
  • 《Agent Runtime 工程化》第七章 权限与安全边界:7.2 shell command policy
  • AJAX 与 Fetch 异步 Web 请求对比
  • Qwen-Image-2512:消费级 GPU 本地部署 AI 文生图方案
  • 2026 年编程语言排行:Python 稳居榜首,Rust 强势崛起
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源、玩法与避坑攻略
  • 大模型日报:今日必读的 8 篇前沿论文
  • Git 上传代码到 GitCode 详细教程
  • Struts2 核心配置文件详解
  • Stable-Diffusion-3.5 提升生成质量:FP8+ComfyUI 调优实战
  • 数组模拟链表、栈、队列与优先队列:高效实现与性能对比
  • FFmpegFreeUI 图形化界面使用指南:音视频格式转换与压缩
  • Spring Boot 集成 WebSocket 实战:实现后台向前端实时推送
  • 25% → 90%!别让 Skills 吃灰:Hooks + Commands + Agents 协同激活 AI 全部能力:Claude Code 工程化实践
  • IntelliJ IDEA 集成 GitHub Copilot 实战指南
  • IntelliJ IDEA 编译报错:-source 1.6 不支持 Diamond 运算符
  • Ubuntu 20.04 系统下 QGroundControl 地面站安装指南
  • Axure 实战:基于中继器的 AI 对话机器人原型设计
  • Openclaw 开源仿生爪如何革新机器人抓取?
  • SDXL Prompt Styler 如何破解 AI 绘画创作失控难题

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online