トレント ファイルの情報ハッシュを解析するために C++ を使用していますが、このサイトと比較して「正しい」ハッシュ値を取得するのに問題があります。
基本が正しいことを確認するために、非常に単純なおもちゃの例を作成しました。
崇高な .torrent ファイルを開き、info ディクショナリ以外のすべてを取り除いたので、次のようなファイルができました。
d6:lengthi729067520e4:name31:ubuntu-12.04.1-desktop-i386.iso12:piece lengthi524288e6:pieces27820:¡´E¶ˆØËš3í ..............(more unreadable stuff.....)..........
このファイルを読み込んで、次のコードで解析します。
#include <string>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <iostream>
#include <openssl/sha.h>
void printHexRep(const unsigned char * test_sha) {
std::cout << "CALLED HEX REP...PREPPING TO PRINT!\n";
std::ostringstream os;
os.fill('0');
os << std::hex;
for (const unsigned char * ptr = test_sha; ptr < test_sha + 20; ptr++) {
os << std::setw(2) << (unsigned int) *ptr;
}
std::cout << os.str() << std::endl << std::endl;
}
int main() {
using namespace std;
ifstream myFile ("INFO_HASH__ubuntu-12.04.1-desktop-i386.torrent", ifstream::binary);
//Get file length
myFile.seekg(0, myFile.end);
int fileLength = myFile.tellg();
myFile.seekg(0, myFile.beg);
char buffer[fileLength];
myFile.read(buffer, fileLength);
cout << "File length == " << fileLength << endl;
cout << buffer << endl << endl;
unsigned char datSha[20];
SHA1((unsigned char *) buffer, fileLength, datSha);
printHexRep(datSha);
myFile.close();
return 0;
}
次のようにコンパイルします。
g++ -o hashes info_hasher.cpp -lssl -lcrypto
そして、私はこの出力に遭遇しました:
4d0ca7e1599fbb658d886bddf3436e6543f58a8b
この出力を期待している場合:
14FFE5DD23188FD5CB53A1D47F1289DB70ABF31E
ここで私が間違っているかもしれないことを誰かが知っていますか? 問題は、ファイルの最後が読めないことにあるのでしょうか? これを最初に16進数か何かとして解析する必要がありますか?