磁力链接的BASE32编码向HEX编码的转换
1、傳統(tǒng)格式
磁力鏈接(簡稱“磁鏈”)是一種下載鏈接格式,下載時的效果相當于使用種子文件進行下載,但是比種子文件便于記錄與傳播。
傳統(tǒng)的磁力鏈接格式,舉例如下:
magnet:?xt=urn:btih:22566ff577354de67fc6315f11c3f3e8804a2356&tr.0=http://tracker.ktxp.com:6868/announce其中,20個字節(jié)的“magnet:?xt=urn:btih:”可以認為是頭,然后是40個字節(jié)的十六進制數(shù)(HEX格式)稱為哈希值,最后是“&”符號帶的可選結(jié)構(gòu)。
經(jīng)過實際試驗,發(fā)現(xiàn)把“&”符號及其后邊的可選結(jié)構(gòu)去掉,絕大多數(shù)客戶端依然可以正確下載。因此,上述磁鏈可以簡化為只有開始的60個字節(jié)。
下文將這種格式的磁力鏈接稱作“HEX編碼磁鏈”。
2、變種格式
動漫愛好者在“花園”使用磁鏈時,會發(fā)現(xiàn)磁鏈的哈希值部分有大量的字母而只有很少的數(shù)字,這和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先不管其“&”符號帶的可選結(jié)構(gòu)有多長,把這些可選結(jié)構(gòu)去掉后,剩下52字節(jié)。其中,頭仍然占20字節(jié),但是哈希值只有32字節(jié)。有些網(wǎng)盤可以識別HEX格式磁鏈,卻無法識別這樣的變種格式的磁鏈。
那么,變種磁鏈的哈希值部分是不是用的三十二進制呢?假設是三十二進制,我們可以很容易的算出來,它們各自轉(zhuǎn)化成二進制后的位數(shù):
對于HEX格式磁鏈,哈希值的每個字節(jié)等效于4位,40個字節(jié)等效于160位。
對于三十二進制,哈希值的每個字節(jié)等效于5位,32個字節(jié)等效于160位。
就是說,它們的位數(shù)是相等的。將十六進制擴展到三十二進制,使用的字符是數(shù)字的'0'~'9'和字母的'A'~'V',但是例子中卻含有字母'W'和'Z',所以,變種磁鏈既是又不是三十二進制的。
答案是BASE32編碼。
BASE32編碼采用字母'A'~'Z'分別表示0~25,用數(shù)字'2'~'7'分別表示26~31。
那么如何把BASE32編碼轉(zhuǎn)換為HEX編碼呢?考慮到4和5的最小公倍數(shù)是20,所以把BASE32編碼按照4字節(jié)一組,翻譯成二進制,再轉(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 ("\n");return 0; }
代碼通過strchr庫函數(shù)把BASE32編碼轉(zhuǎn)化成三十二進制編碼,實際上可以有很多別的方法更高效,這里只講原理,沒有做優(yōu)化、錯誤處理之類的展開。
接下來移位合并,最后以HEX格式輸出。
輸出結(jié)果:
magnet:?xt=urn:btih:9085AB5955B565F26502A8CDD5055C8F266D0496
分別用客戶端識別這個輸出結(jié)果的磁鏈和原始磁鏈,發(fā)現(xiàn)識別結(jié)果是一樣的。
反過來的轉(zhuǎn)換也是可行的,只不過HEX格式可以簡單地用“%05X”格式化輸出,BASE32編碼的輸出則要麻煩些。
轉(zhuǎn)載于:https://www.cnblogs.com/sugar13/p/10216600.html
總結(jié)
以上是生活随笔為你收集整理的磁力链接的BASE32编码向HEX编码的转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins初探
- 下一篇: Eclipse中如何修改SVN的地址