日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

磁力链接的BASE32编码向HEX编码的转换

發(fā)布時間:2023/12/31 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 磁力链接的BASE32编码向HEX编码的转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、傳統(tǒng)格式

磁力鏈接(簡稱“磁鏈”)是一種下載鏈接格式,下載時的效果相當(dāng)于使用種子文件進(jìn)行下載,但是比種子文件便于記錄與傳播。

傳統(tǒng)的磁力鏈接格式,舉例如下:

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

其中,20個字節(jié)的“magnet:?xt=urn:btih:”可以認(rèn)為是頭,然后是40個字節(jié)的十六進(jìn)制數(shù)(HEX格式)稱為哈希值,最后是“&”符號帶的可選結(jié)構(gòu)。

經(jīng)過實(shí)際試驗(yàn),發(fā)現(xiàn)把“&”符號及其后邊的可選結(jié)構(gòu)去掉,絕大多數(shù)客戶端依然可以正確下載。因此,上述磁鏈可以簡化為只有開始的60個字節(jié)。

下文將這種格式的磁力鏈接稱作“HEX編碼磁鏈”。

2、變種格式

動漫愛好者在“花園”使用磁鏈時,會發(fā)現(xiàn)磁鏈的哈希值部分有大量的字母而只有很少的數(shù)字,這和HEX的印象差遠(yuǎn)了,比如:

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

先不管其“&”符號帶的可選結(jié)構(gòu)有多長,把這些可選結(jié)構(gòu)去掉后,剩下52字節(jié)。其中,頭仍然占20字節(jié),但是哈希值只有32字節(jié)。有些網(wǎng)盤可以識別HEX格式磁鏈,卻無法識別這樣的變種格式的磁鏈。

那么,變種磁鏈的哈希值部分是不是用的三十二進(jìn)制呢?假設(shè)是三十二進(jìn)制,我們可以很容易的算出來,它們各自轉(zhuǎn)化成二進(jìn)制后的位數(shù):

對于HEX格式磁鏈,哈希值的每個字節(jié)等效于4位,40個字節(jié)等效于160位。

對于三十二進(jìn)制,哈希值的每個字節(jié)等效于5位,32個字節(jié)等效于160位。

就是說,它們的位數(shù)是相等的。將十六進(jìn)制擴(kuò)展到三十二進(jìn)制,使用的字符是數(shù)字的'0'~'9'和字母的'A'~'V',但是例子中卻含有字母'W'和'Z',所以,變種磁鏈既是又不是三十二進(jìn)制的。

答案是BASE32編碼。

BASE32編碼采用字母'A'~'Z'分別表示0~25,用數(shù)字'2'~'7'分別表示26~31。

那么如何把BASE32編碼轉(zhuǎn)換為HEX編碼呢?考慮到4和5的最小公倍數(shù)是20,所以把BASE32編碼按照4字節(jié)一組,翻譯成二進(jìn)制,再轉(zhuǎn)換為5字節(jié)的HEX編碼就行了。

3、編碼轉(zhuǎn)換

示例代碼如下(未封裝、未做錯誤處理):

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 ("
");

    return 0;
}

代碼通過strchr庫函數(shù)把BASE32編碼轉(zhuǎn)化成三十二進(jìn)制編碼,實(shí)際上可以有很多別的方法更高效,這里只講原理,沒有做優(yōu)化、錯誤處理之類的展開。

接下來移位合并,最后以HEX格式輸出。

輸出結(jié)果:

magnet:?xt=urn:btih:9085AB5955B565F26502A8CDD5055C8F266D0496

分別用客戶端識別這個輸出結(jié)果的磁鏈和原始磁鏈,發(fā)現(xiàn)識別結(jié)果是一樣的。

反過來的轉(zhuǎn)換也是可行的,只不過HEX格式可以簡單地用“%05X”格式化輸出,BASE32編碼的輸出則要麻煩些。

總結(jié)

以上是生活随笔為你收集整理的磁力链接的BASE32编码向HEX编码的转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。