磁力链接格式特征是:必须以“magnet:”开头,含“xt=urn:btih:”参数,其后哈希值为40字符十六进制或32字符base32编码,且严格区分大小写、不允许多余符号或URL编码。

磁力链接的格式特征是什么
磁力链接(magnet URI)有明确的 RFC 标准(RFC 2397 衍生,实际以 magnet:?xt= 开头),不是任意含 magnet: 的字符串都合法。关键识别点有三个:协议头、必需参数、哈希值格式。
- 必须以
"magnet:"开头(注意冒号,区分于普通 URL) - 必须包含
xt参数(eXact Topic),且其值必须是urn:btih:开头(BitTorrent info hash) -
urn:btih:后面的哈希值必须是 32 字节(40 字符 hex)或 32 字节 base32 编码(通常是 32 字符,如AIDJF2VQDQZ6QKU3WYX7H5N8R1T9L4M0),不能混用或截断
用 std::string 做基础校验的步骤
C++ 没有内置 URI 解析器,但可用标准库完成轻量级验证。重点不是“解析所有参数”,而是快速排除明显非法输入。
- 先检查前缀:
str.substr(0, 8) == "magnet:"(长度至少为 8) - 找到
"xt=urn:btih:"出现的位置,且该子串必须在?或&分隔的参数边界内(简单做法:用find("xt=urn:btih:"),再确认前面是?或&或开头) - 提取
xt=后的值:跳过"xt=urn:btih:",取剩余部分;长度必须是 32(base32)或 40(hex),且只含合法字符(0-9a-fA-F或 base32 字母表)
std::string extract_btih(const std::string& s) {
size_t pos = s.find("xt=urn:btih:");
if (pos == std::string::npos) return {};
pos += 12; // skip "xt=urn:btih:"
size_t end = s.find_first_of("&?", pos);
std::string hash = (end == std::string::npos) ? s.substr(pos) : s.substr(pos, end - pos);
// trim whitespace if any (though magnet spec forbids it, some clients add)
hash.erase(0, hash.find_first_not_of(" \t"));
hash.erase(hash.find_last_not_of(" \t") + 1);
return hash;
}
校验哈希值是否符合 BT 协议要求
BitTorrent 官方接受两种编码:40 字符 hex(SHA-1)和 32 字符 base32(RFC 4648 §6)。二者不能共存,也不能是其他长度或字符。
- 若长度为 40:逐字符检查是否全在
"0123456789abcdefABCDEF"中 - 若长度为 32:检查是否只含 base32 字母表
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"(注意不含 0、1、8、9) - 其他长度(比如 39、41、31)直接判为非法
- 空字符串、全空格、含换行符也应提前过滤
注意:std::isxdigit 对非 ASCII locale 可能误判,建议手写字符集查表或用 std::find_first_not_of:
立即学习“C++免费学习笔记(深入)”;
bool is_valid_hex_hash(const std::string& h) {
return h.length() == 40 && h.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos;
}
<p>bool is_valid_base32_hash(const std::string& h) {
static const std::string base32_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
return h.length() == 32 && h.find_first_not_of(base32_chars) == std::string::npos;
}</p>容易忽略的边界情况
真实场景中,用户粘贴的“磁力链接”常带干扰信息:前后空格、换行、引号、HTML 实体(如 &)、URL 编码(%3A 代替 :)。这些不会被 BitTorrent 客户端接受,也不应算作合法磁力链接。
- 不要自动解码 URL 编码:磁力链接本身不鼓励编码,
%3A在xt=值里就是错的 - 不要容忍引号包裹:
"magnet:?xt=..."是 shell 或 HTML 场景的副作用,协议层面不合法 - 不要接受
magnet://:这是常见误写,正确协议名是magnet:(无斜杠) - 大小写敏感:
URN:BTIH:不合法,必须是小写的urn:btih:(RFC 要求 scheme 和 namespace 小写)
校验函数返回 true 前,务必确保原始字符串未经过任何预处理 —— 合法性判断必须基于用户输入的原始字节序列。


















