技术好文共享:磁力链接的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)
840 1
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
1975 1
安装MySQ报错 warning: /var/cache/yum/x86_64/7/mysql80-community/packages/mysql-community-client-8.0.
|
Web App开发 移动开发 小程序
扫普通链接二维码打开小程序的踩坑过程...
扫普通链接二维码打开小程序的踩坑过程...
5798 0
扫普通链接二维码打开小程序的踩坑过程...
|
Linux 开发工具
Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
获取 GPG 密钥失败:[Errno 14] curl#37 - “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7” 这个就是安装的时候会检查key这个可以再repo文件中关闭即可
3344 0
|
人工智能 Java 物联网
没有好的学历,Java开发未来的路应该怎么走?
在数字化时代,Java开发者即使没有高学历,也能通过拥抱新兴技术(如大模型应用与鸿蒙系统开发)、积累实战经验、持续学习新技能等途径实现职业突破。从参与开源项目到关注行业动态,再到规划技术专家或管理路线,建立人脉网络并利用教育平台提升能力,开发者可拓宽技术边界,适应日新月异的技术需求,在未来发展中占据一席之地。
|
BI Python
利用OpenPyXL实现Excel条件格式化
本文介绍如何使用Python的`openpyxl`库为Excel文件添加条件格式,包括颜色渐变、图标集、数据条及基于公式的规则等,提升数据可读性和美观度。通过具体示例,展示了从安装库、加载文件到应用各种条件格式的详细过程,最后保存修改后的文件。
1082 12
|
存储 分布式计算 NoSQL
DataX深度剖析:解读数据传输工具的设计理念与架构特点
DataX深度剖析:解读数据传输工具的设计理念与架构特点
2042 5
DataX深度剖析:解读数据传输工具的设计理念与架构特点
|
机器学习/深度学习 算法 人机交互
智能语音识别技术的最新进展与未来趋势####
【10月更文挑战第21天】 在当今这个信息爆炸的时代,人机交互方式正经历着前所未有的变革。本文深入探讨了智能语音识别技术的前沿动态,从深度学习模型的创新应用到跨语言、跨领域的适应性增强,揭示了该领域如何不断突破技术壁垒,提升用户体验的真实案例与数据支撑。通过对比分析当前主流算法的性能差异,本文旨在为研究者和开发者提供一幅清晰的技术演进蓝图,同时展望了多模态融合、情感识别等新兴方向的广阔前景。 ####
1623 7
|
数据可视化 IDE Linux
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
3773 3