-1

SubDB API を使用しようとしていますが、ファイルのハッシュを計算するのに問題があります。ハッシュは、ビデオ ファイルの最初と最後の 64kb を取得し、すべてをまとめて、結果のデータ (128kb) の md5 を生成することによって構成されます。Python で記述された次の関数は、ハッシュ アルゴリズムを実装します。

def get_hash(name):
        readsize = 64 * 1024
        with open(name, 'rb') as f:
            size = os.path.getsize(name)
            data = f.read(readsize)
            f.seek(-readsize, os.SEEK_END)
            data += f.read(readsize)
        return hashlib.md5(data).hexdigest()

私は C++ Builder XE2 を使用しており、これを次のように翻訳しようとしました。

String __fastcall MD5Hash(const AnsiString filename)
{
     String result;
     char firstbits[60*1024], lastbits[60*1024];
     char bits[120*1024];

     FILE* f = fopen(filename.c_str(), "rb");
     if(f ==NULL) {ShowMessage("Error!"); return "";}
     TIdHashMessageDigest5 *idmd5= new TIdHashMessageDigest5();
     try  {
        fread(firstbits, 60*1024, 1, f);
        fseek(f, -(long)60*1024, SEEK_END);
        fread(lastbits, 60*1024, 1, f);
        strcpy(bits, firstbits);
        strcpy(bits, lastbits);
        result= idmd5->HashBytesAsHex(RawToBytes(bits, 120*1024));
     }
     __finally    {
        delete idmd5;
     }
     fclose(f);
     return result;
}

テスト ファイルはhttp://thesubdb.com/api/samples/dexter.mp4であり、そのハッシュ値 (上記のアルゴリズムから) は ffd8d4aa68033dc03d1c8ef373b9028c である必要があります。でも、うまくいかない…。

Delphi ソリューションでも問題ありません。

4

1 に答える 1

4

以下のコードを試してみてはいかがでしょうか。サイズを変更し、適切なフレッドを実行し、strcpy を削除しました。

String __fastcall MD5Hash(const AnsiString filename)
{
     String result;
     char bits[128*1024];

     FILE* f = fopen(filename.c_str(), "rb");
     if(f ==NULL) {ShowMessage("Error!"); return "";}
     TIdHashMessageDigest5 *idmd5= new TIdHashMessageDigest5();
     try  {
        fread(bits, 64*1024, 1, f);
        fseek(f, -(long)64*1024, SEEK_END);
        fread(&bits[64*1024], 64*1024, 1, f);
        result= idmd5->HashBytesAsHex(RawToBytes(bits, 128*1024));
     }
     __finally    {
        delete idmd5;
     }
     fclose(f);
     return result;
}
于 2013-06-11T08:20:47.123 に答える