磁力鏈結的BASE32編碼向HEX編碼的轉換

2021-07-10 06:07:15 字數 2047 閱讀 3723

magnet:?xt=urn:btih:22566ff577354de67fc6315f11c3f3e8804a2356&tr.0=
其中,20個位元組的「

magnet:?xt=urn:btih:

」可以認為是頭,然後是40個位元組的十六進製制數(hex格式)稱為雜湊值,最後是「

&」符號帶的可選結構。

經過實際試驗,發現把「

&下文將這種格式的磁力鏈結稱作「hex編碼磁鏈」。

動漫愛好者在「花園」使用磁鏈時,會發現磁鏈的雜湊值部分有大量的字母而只有很少的數字,這和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編碼就行了。

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

char *m="magnet:?xt=urn:btih:scc2wwkvwvs7ezicvdg5kbk4r4tg2bew";

int main()

printf ("\n");

return 0;

}

**通過strchr庫函式把base32編碼轉化成三十二進位制編碼,實際上可以有很多別的方法更高效,這裡只講原理,沒有做優化、錯誤處理之類的展開。

接下來移位合併,最後以hex格式輸出。

輸出結果:

magnet:?xt=urn:btih:9085ab5955b565f26502a8cdd5055c8f266d0496

分別用客戶端識別這個輸出結果的磁鏈和原始磁鏈,發現識別結果是一樣的。

反過來的轉換也是可行的,只不過hex格式可以簡單地用「%05x」格式化輸出,base32編碼的輸出則要麻煩些。

BASE32編碼 記錄

一 base32 資料編碼簡介 base32這種資料編碼機制,主要用來把二進位制資料編碼成可見的字串,其編碼規則是 任意給定乙個二進位制資料,以5個位 bit 為一組進行切分 base64以6 個位 bit 為一組 對切分而成的每個組進行編碼得到 1個可見字元。base32 編碼表字符集中的字元總數...

BASE32編碼 記錄

base32 編碼 記錄一 base32 資料編碼簡介 base32 這種資料編碼機制,主要用來把二進位制資料編碼成可見的字串,其編碼規則是 任意給定乙個二進位制資料,以5個位 bit 為一組進行切分 base64以6 個位 bit 為一組 對切分而成的每個組進行編碼得到 1個可見字元。base32...

hex和base32和base64的區別與聯絡

看個例子 package main import fmt import encoding hex import encoding base32 import encoding base64 func main 有些小夥伴可能有疑問,為啥要把 hello world 這麼明白的東西變成一串看不懂的東西...