1、传统格式

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

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

magnet:?xt=urn:btih:22566ff577354de67fc6315f11c3f3e8804a2356&tr.0=http://tracker.ktxp.com:6868/announce

其中,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";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编码的输出则要麻烦些。

转载于:https://www.cnblogs.com/sugar13/p/10216600.html

磁力链接的BASE32编码向HEX编码的转换相关推荐

  1. java hex 编码_1-Hex编码

    编码原理 Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都 ...

  2. dht java_java 构建磁力链接索引:Bencode 关于DHT的编码

    前言bencode 是 dht 的标准编码格式,DHT如果你没听说过,那磁力链接总得听说过吧,磁力链接就是基于DHT发展起来 想要自己建立磁力建立一套磁力链接索引,用来查询相关的资源,那么Bencod ...

  3. c# 读hex_C# Hex编码和解码

    /// 从字符串转换到16进制表示的字符串 /// 编码,如"utf-8","gb2312" /// 是否每字符用逗号分隔 public static stri ...

  4. 磁力链接 结构解析 分享

    磁力链接由一组参数组成,参数间的顺序没有讲究,其格式与在HTTP链接末尾的查询字符串相同.最常见的参数是"xt",是"exact topic"的缩写,通常是一个 ...

  5. 一个简单的爬取一个电影网的磁力链接

    import requests from lxml import etree from urllib import parse import re#定义一个函数 def ygdy(baseurl):h ...

  6. java菱形乱码 编码_JAVA:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  7. 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )

    文章目录 安卓直播推流专栏博客总结 一. 音频数据采集.编码 二. AAC 高级音频编码 三. FAAC 编码器 四. Ubuntu 18.04.4 交叉编译 FAAC 编码器 安卓直播推流专栏博客总 ...

  8. C++实现RTMP协议发送H.264编码及AAC编码的音视频

    C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司 ...

  9. python3编码声明_python3编码问题汇总

    这两天写了个监测网页的爬虫,作用是跟踪一个网页的变化,但运行了一晚出现了一个问题....希望大家不吝赐教! 我用的是python3,错误在对html response的decode时抛出,代码原样为: ...

最新文章

  1. 人人都能看懂的 6 种限流实现方案!(纯干货)
  2. Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)
  3. mysql query cache 命中率_MySQL缓存命中率概述及如何提高缓存命中率
  4. silverlight 实时更新 marquee效果
  5. Machine Learning - Andrew Ng on Coursera (Week 1)
  6. 上下定高 中间自适应_ADAS|驾驶辅助系统之自适应灯光照明系统
  7. XCode中设置字体大小
  8. OxyPlot 导出图片及 WPF 元素导出为图片的方法
  9. background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
  10. 全网最全的 Java各类技术栈 架构图汇总(建议收藏)
  11. pythonic code_Pythonic Code (Part III)
  12. 探索解析微服务下的RabbitMQ
  13. keepalived实现LVS-DR模型的高可用
  14. 软件测试之项目立项与需求评审
  15. 计算机网卡ip怎么设置,怎样为网卡配置ip地址 电脑给网卡设置IP地址的方法有哪些...
  16. [Power Query]:自动提取自定义一周的数据
  17. 白天不去搜寻痛苦,但晚上却不能抑制
  18. python写安卓游戏_10分钟学会python写游戏脚本!Python其实很简单
  19. Excel如何实现两个工作表数据的对比
  20. C语言实现用户输入数字输出输入的为几时几分几秒

热门文章

  1. 【Linux】一步一步学Linux——usernetctl命令(175)
  2. mongodb 输出数组字段_JMeter之Groovy对MongoDB操作
  3. python实现二分查找算法_python实现二分查找算法
  4. 学习MFC首先要知道的--程序执行顺序
  5. 学习笔记-----关于VS中使用模板类出现无法解析的外部符号问题
  6. java 学习笔记2022.1.26
  7. Promise对象的创建与使用
  8. VMWare虚拟机转换成KVM
  9. CTreeCtrl控件的使用小记
  10. Linux虚拟机设备无法连接到它的理想主机控制器