磁力链接的BASE32编码向HEX编码的转换
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编码的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins初探
- 下一篇: Eclipse中如何修改SVN的地址