MD5 File-checksum mit crypto++

Er sagt das ja mit der Fehlerzeile(!)
Ich bin mittlerweile relativ sicher, dass es geht:)
PS: GCC kann nicht das nicht wirklich sagen!
 
Zuletzt bearbeitet:
Moin,

also der Code sieht so aus:
Code:
        string md5_string;
        CryptoPP::Weak1::MD5 hash;
        CryptoPP::StringSink sink(md5_string);
        CryptoPP::HexEncoder hexEncoder(&sink);
        CryptoPP::HashFilter hashFilter(hash, &hexEncoder);
        CryptoPP::FileSource( itr->path().string().c_str(), true, hashFilter); //hier liegt das Problem, "Z.  48"

Code:
main.cpp||In function »void print_files(std::string)«:|
main.cpp|48|Fehler: keine passende Funktion für Aufruf von »CryptoPP::FileSource::FileSource(const char*, bool, CryptoPP::HashFilter&)«|
crypto/files.h|60|Anmerkung: Kandidaten sind: CryptoPP::FileSource::FileSource(const char*, bool, CryptoPP::BufferedTransformation*, bool)|
crypto/files.h|58|Anmerkung: CryptoPP::FileSource::FileSource(std::istream&, bool, CryptoPP::BufferedTransformation*)|
crypto/files.h|56|Anmerkung: CryptoPP::FileSource::FileSource(CryptoPP::BufferedTransformation*)|
crypto/files.h|50|Anmerkung: CryptoPP::FileSource::FileSource(const CryptoPP::FileSource&)|
Das ist nun aber eine ganz andere Fehlermeldung als vorher.

Du versuchst hier eine Referenz statt eines Zeigers zu übergeben:
C++:
CryptoPP::FileSource( itr->path().string().c_str(), true, &hashFilter);
\edit: wobei das in der Form (sehr) wahrscheinlich eine schlechte Idee ist, da das FileSource Objekt Besitz vom übergenenen hashFilter ergreift und dann später delete aufruft, was dann zu einem Laufzeitfehler führt. Du mußt (vermutlich) die Objekte alle mit new erzeugen.

Und was an der Formulierung "vollständiger Code" hast du denn nicht verstanden? Mach ein Minimalbeispiel.

Gruß
 
Zuletzt bearbeitet:
Ah, du hast recht! Wie konnte ich das nur übersehen....

Vielen Dank, deepthroat!

Allerdings habe ich nun das Problem, dass ich ein SIGABRT erhalte, offenbar durch ~StringSinkTemplate (siehe Datei).

Zum Code: Ich hielt das für den relevanten, was genau würdest du noch wollen? Hier die komplette Funktion:
Code:
void print_files (std::string path)
  {

      ofstream files;
        string filename = path+"/checksums.txt"; //darin werden sie gespeichert
       files.open(filename.c_str());

      boost::filesystem::directory_iterator end_itr;
  for ( boost::filesystem::directory_iterator itr(path);
        itr != end_itr;
        ++itr )
  {
    if ( boost::filesystem::is_directory(itr->status()) )
    {
      print_files( itr->path().string()) ;
    }
    else // see below
    {


        string md5_string;
        CryptoPP::Weak1::MD5 hash;
        CryptoPP::StringSink sink(md5_string);
        CryptoPP::HexEncoder hexEncoder(&sink);
        CryptoPP::HashFilter hashFilter(hash, &hexEncoder);
        CryptoPP::FileSource( itr->path().string().c_str(), true, &hashFilter);
        files<<itr->path()<<":\t"<<md5_string<<"\n"; //in die Datei schreiben


    }
  }

Gruß,

badday
 

Anhänge

  • error.txt
    3,4 KB · Aufrufe: 18
Zuletzt bearbeitet:
Wunderbar. Nun funktioniert alles. Vielen Dank!
Der Vollständigkeit halber hier die Lösung:

Code:
string md5_string;
CryptoPP::Weak1::MD5 hash;        
CryptoPP::FileSource( itr->path().string().c_str(), true, new CryptoPP::HashFilter(hash, new CryptoPP::HexEncoder(new CryptoPP::StringSink(md5_string))));

Gruß,

badday
 
Zurück