mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-10-22 02:36:15 +03:00
Created How to convert base32 to base16 info-hashes (markdown)
parent
ead1927912
commit
ad387e5217
1 changed files with 55 additions and 0 deletions
55
How-to-convert-base32-to-base16-info-hashes.md
Normal file
55
How-to-convert-base32-to-base16-info-hashes.md
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
### Using info-hashes as downloads handles.
|
||||||
|
|
||||||
|
When interfacing qBittorrent through the WebUI api, there are cases when you add a download via a magnet URI and then you want to track its state (for instance, to perform certain file operation once it's finished). The problem here is that the /command/download method does not return a handle to the download for you to track it. On the other hand, webUI api methods refer to every download through its info-hash, so it's possible to use that string as a handle. As every magnet URI will contain, al least, the info-hash (as stated in [this](http://www.bittorrent.org/beps/bep_0009.html) document at BitTorrent.org) you can parse the hash string from the uri itself. These hashes are base16 encoded, for a total of 40 characters.
|
||||||
|
|
||||||
|
### Special case: base32 encoded info-hashes.
|
||||||
|
|
||||||
|
For compatibility reasons, the same document states that clients should also support the 32 character base32 encoded info-hash. When adding such a magnet link, qBittorrent will automatically convert it to a base16 hash, and you end up with a mismatching handle (the original base32 encoded info-hash and the base16 one used by qBittorrent). In this situation it's necesary to previously re-encode the hash yourself. Basically you need to decode the base32 hash and then re-encode it to base16, this way you´ll have the same string as qBittorrent.
|
||||||
|
|
||||||
|
### Example:
|
||||||
|
Supose you have the following magnet link:
|
||||||
|
|
||||||
|
magnet:?xt=urn:btih:WRN7ZT6NKMA6SSXYKAFRUGDDIFJUNKI2
|
||||||
|
|
||||||
|
if it´s added to qBittorrent and then you issue a /query/torrents command, you´ll get a JSON object like this (fields other than "hash" are ommited):
|
||||||
|
|
||||||
|
[{...,"hash":"b45bfccfcd5301e94af8500b1a1863415346a91a",...},...]
|
||||||
|
|
||||||
|
which shows how qBittorrent converted our base32 hash to its base16 representation.
|
||||||
|
|
||||||
|
### How to implement the base conversion:
|
||||||
|
|
||||||
|
If you're into python, this base conversion can be accomplished as follows:
|
||||||
|
|
||||||
|
>>> import base64
|
||||||
|
>>> b32Hash = "WRN7ZT6NKMA6SSXYKAFRUGDDIFJUNKI2"
|
||||||
|
>>> b16Hash = base64.b16encode(base64.b32decode(b32Hash))
|
||||||
|
>>> b16Hash = b16Hash.lower()
|
||||||
|
>>> print (b16Hash)
|
||||||
|
|
||||||
|
which will output: b'b45bfccfcd5301e94af8500b1a1863415346a91a'
|
||||||
|
|
||||||
|
In Delphi, you can make use of the excellent SZCodeBaseX library by Sasa Zeman (available for D4 to D2007, support seems to be dropped by now, but it's still available [here](http://www.torry.net/vcl/internet/coding/SZCodeBaseX.zip). This is a simple console application just to show how to perform the base conversion:
|
||||||
|
|
||||||
|
program Project1;
|
||||||
|
|
||||||
|
{$APPTYPE CONSOLE}
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils,
|
||||||
|
SZCodeBaseX in '<path to the library>';
|
||||||
|
|
||||||
|
var
|
||||||
|
b32Hash: AnsiString;
|
||||||
|
b16Hash: AnsiString;
|
||||||
|
|
||||||
|
begin
|
||||||
|
b32Hash:= 'WRN7ZT6NKMA6SSXYKAFRUGDDIFJUNKI2';
|
||||||
|
b16Hash:= SZEncodeBase16(SZDecodeBase32(b32Hash));
|
||||||
|
b16Hash:= LowerCase(b16Hash);
|
||||||
|
Writeln(b16Hash);
|
||||||
|
end.
|
||||||
|
|
||||||
|
If you compile and run Project1.exe, it´ll output the converted hash string.
|
||||||
|
|
||||||
|
Notice in both cases you need to perform a lowercase conversion of the resulting string.
|
Loading…
Reference in a new issue