磁力链接的BASE32编码向HEX编码的转换
来源:互联网 发布:朋友圈关系网软件 编辑:程序博客网 时间:2024/04/30 15:39
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编码的输出则要麻烦些。
- 磁力链接的BASE32编码向HEX编码的转换
- 编码系列--Base32编码的完整示例
- JS的Base32编码和SHA
- Base32编码
- 编码系列--Base32编码
- Base32编码(修正)
- BASE32编码 --记录
- BASE32编码--记录
- Java Base32编码
- GBK(GB2312)向UTF-8的编码转换
- GBK(GB2312)向UTF-8的编码转换
- GBK(GB2312)向UTF-8的编码转换
- GBK(GB2312)向UTF-8的编码转换 -- C++
- bcd与hex转换、以及编码格式
- xmlhttp的编码转换
- 编码的强制转换
- 中文编码的转换
- 编码格式的转换
- hello,world! python
- string的修改
- PCA使用SVD解决
- Java代码注释规范
- Oracle 11g R2 RAC高可用连接特性 – SCAN详解1
- 磁力链接的BASE32编码向HEX编码的转换
- HDU 4614 Vases and Flowers (线段树 + 二分)
- LeetCode 40 - Combination Sum II
- HDU-1358 Period (kmp)
- nyoj A*B Problem II 623 (矩阵相乘)
- yocto配置好eclipse之后编译多线程配置
- 【tyvj1863】【codevs1995】黑魔法师之门,有毒的并查集
- Oracle 11g R2 RAC高可用连接特性 – SCAN详解2
- nginx的常用命令