技术好文共享:磁力链接的BASE32编码向HEX编码的转换

简介: 技术好文共享:磁力链接的BASE32编码向HEX编码的转换

1、传统格式


磁力链接(简称“磁链”)是一种下载链接格式,下载时的效果相当于使用种子文件进行下载,但是比种子文件便于记录与传播。


传统的磁力链接格式,举例如下:


magnet:?xt=urn:btih:22566ff577354de67fc6315f11c3f3e8804a2356&tr.0=其中,20个字节的“magnet:?xt=urn:btih:”可以认为是头,然后是40个字节的十六进制数(HEX格式)称为哈希值,最后是“&”符号带的可选结构。


经过实际试验,发现把“&”符号及其后边的可选结构去掉,绝大多数客户端依然可以正确下载。因此,上述磁链可以简化为只有开始的60个字节。


下文将这种格式的磁力链接称作“HEX编码磁链”。


2、变种格式


动漫爱好者在“花园”使用磁链时,会发现磁链的哈希值部分有大量的字母而只有很少的数字,这和HEX的印象差远了,比如:


magnet:?xt=urn:btih:SCC2WWKVWVS7EZICVDG5KBK4R4TG2BEW&dn=&tr=http%3A%2F%2F208.67.16.113%3A8000%2Fannounce&tr=udp%3A%2F%2F208.67.16.113%3A8000%2Fannounce&tr=http%3A%2F%2Ftracker.openbittorrent.com%3A80%2Fannounce&tr=http%3A%2F%2Ftracker.publicbt.com%3A80%2Fannounce&tr=http%3A%2F%2Ftracker.prq.to%2Fannounce&tr=http%3A%2F%2Fopen.acgtracker.com%3A1096%2Fannounce&tr=http%3A%2F%2Ftr.bangumi.moe%3A6969%2Fannounce&tr=https%3A%2F%2Ft-115.rhcloud.com%2Fonly_for_ylbud&tr=http%3A%2F%2Fbtfile.sdo.com%3A6961%2Fannounce&tr=http%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=https%3A%2F%2Ftr.bangumi.moe%3A9696%2Fannounce&tr=http%3A%2F%2Ft2.popgo.org%3A7456%2Fannounce先不管其“&”符号带的可选结构有多长,把这些可选结构去掉后,剩下52字节。其中,头仍然占20字节,但是哈希值只有32字节。有些网盘可以识别HEX格式磁链,却无法识别这样的变种格式的磁链。


那么,变种磁链的哈希值部分是不是用的三十二进制呢?假设是三十二进制,我们可以很容易的算出来,它们各自转化成二进制后的位数:


对于HEX格式磁链,哈希值的每个字节等效于4位,40个字节等效于160位。


对于三十二进制,哈希值的每个字节等效于5位,32个字节等效于160位。


就是说,它们的位数是相等的。将十六进制扩展到三十二进制,使用的字符是数字的'0'~'9'和字母的'A'~'V',但是例子中却含有字母'W'和'Z',所以,变种磁链既是又不是三十二进制的。


答案是BASE32编码。


BASE32编码采用字母'A'~'Z'分别表示0~25,用数字'2'~'7'分别表示26~31。


那么如何把BASE32编码转换为HEX编码呢?考虑到4和5的最小公倍数是20,所以把BASE32编码按照4字节一组,翻译成二进制,再转换为5字节的HEX编码就行了。


3、编码转换


示例代码如下(未封装、未做错误处理):


char m="magnet:?xt=urn:btih:SCC2WWKVWVS7EZICVDG5KBK4R4TG2BEW";


//代码效果参考:http://www.lyjsj.net.cn/wz/art_24011.html

int main()

{


const char base32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";


int i = 0;


printf ("magnet:?xt=urn:btih:");


for (i = 20; i < 52; i += 4)


{


long b3 = strchr (base32, m【i + 0】) - base32;


long b2 = strchr (base32, m【i + 1】) - base32;


long b1 = strchr (base32, m【i + 2】) - base32;


long b0 = strchr (base32, m【i + 3】) - base32;


long b = b3 [ 15 | b2 [ 10 | b1 [ 5 | b0;


printf ("%05X", b);


}


printf ("\n");


return 0;


}


代码通过strchr库函数把BASE32编码转化成三十二进制编码,实际上可以有很多别的方法更高效,这里只讲原理,没有做优化、错误处理之类的展开。


接下来移位合并,最后以HEX格式输出。


输出结果:


magnet:?xt=urn:btih:9085AB5955B565F26502A8CDD5055C8F266D0496


分别用客户端识别这个输出结果的磁链和原始磁链,发现识别结果是一样的。


反过来的转换也是可行的,只不过HEX格式可以简单地用“%05X”格式化输出,BASE32编码的输出则要麻烦些。

相关文章
|
机器学习/深度学习 算法 程序员
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
476 1
|
Linux
Linux网关路由配置
Linux网关路由配置
346 0
|
1月前
|
人工智能 自然语言处理 前端开发
AI 调酒师上岗!Qwen3-Coder × 通义灵码完成 AI 调酒师项目实战开发
本课程通过“AI调酒师”项目实战,讲解如何使用通义灵码与Qwen3-Coder模型结合阿里云百炼平台,从需求分析、前端界面搭建、后端服务调用到整体部署的全流程开发。内容涵盖Bento UI设计、Tailwind CSS布局、语音识别与大模型内容生成,并结合MCP服务实现设计稿驱动开发,帮助开发者快速构建趣味AI应用,提升产品落地能力。
310 33
|
9月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1868 141
|
Windows
windows 电脑 连接蓝牙耳机没有麦克风
【8月更文挑战第31天】当Windows电脑连接蓝牙耳机后无法使用麦克风时,可尝试以下步骤解决:检查蓝牙设置,确保耳机正确连接并开启麦克风选项;检查音频设备设置,确认蓝牙耳机为默认播放和录制设备;更新蓝牙和音频驱动;确认耳机与系统的兼容性及正确设置。如问题未解,可重新配对耳机或联系客服。
8634 7
|
存储 算法 安全
密码算法的分类
【8月更文挑战第23天】
778 0
|
10月前
|
网络安全 开发工具 数据安全/隐私保护
自建内网穿透服务器
本文介绍了如何使用FRP实现内网穿透。首先准备一台具有公网IP的云服务器和一台内网服务器,接着在云服务器上安装Docker和FRP服务端,配置`frps.ini`文件并启动服务。在内网服务器上手动安装FRP客户端,配置`frpc.ini`文件并启动服务。最后通过FRP控制台验证连接状态,确保可以通过公网IP访问内网服务。
2181 10
自建内网穿透服务器
|
监控 JavaScript Shell
如何安装和管理 Supervisor
如何安装和管理 Supervisor
343 0
|
运维 Linux Docker
【运维面试100问】(一)打包了一个镜像推送上去harbor,推不上是什么原因
【运维面试100问】(一)打包了一个镜像推送上去harbor,推不上是什么原因
【运维面试100问】(一)打包了一个镜像推送上去harbor,推不上是什么原因
|
安全 Java Shell
Android 权限管理
Android 权限管理
466 0