Хеш-файл рекурсивен и сохраняется в векторный Cryptopp - PullRequest
0 голосов
/ 27 октября 2018

Я хочу получить хеш-файлы.в текущем пути есть 4 файла.и он должен хешировать и сохранять в векторный вывод для выполнения другой задачи позже.

CryptoPP::SHA256 hash;
std::vector<std::string> output;
for(auto& p : std::experimental::filesystem::recursive_directory_iterator(std::experimental::filesystem::current_path()))
{
    if (std::experimental::filesystem::is_regular_file(status(p)))
    {
        CryptoPP::FileSource(p, true, new CryptoPP::HashFilter(hash, new CryptoPP::HexEncoder(new CryptoPP::StringSink(output))), true);
    }
}

for (auto& list : output)
{
    std::cout << list << std::endl;
}
getchar();
return 0;

я получаю эти ошибки

  1. Описание нет экземпляра конструктора "CryptoPP :: FileSource ::FileSource "соответствует списку аргументов
  2. Описание нет экземпляра конструктора" CryptoPP :: StringSinkTemplate :: StringSinkTemplate [with T = std :: string] "соответствует списку аргументов
  3. Description 'CryptoPP ::StringSinkTemplate :: StringSinkTemplate (const CryptoPP :: StringSinkTemplate &) ': невозможно преобразовать аргумент 1 из' std :: vector> 'в' T & '
  4. Description' ': невозможно преобразовать из «списка инициализаторов» в «CryptoPP :: FileSource '

`

1 Ответ

0 голосов
/ 27 октября 2018

Чтобы свести ваш код к его основам:

std::vector<std::string> output;
FileSource(p, true, new HashFilter(hash, new HexEncoder(new StringSink(output))), true);

Crypto ++ StringSink принимает ссылку на std::string, а не std::vector<std::string>. Также см. StringSink в руководстве по Crypto ++.

FileSource необходимо имя файла, а не имя каталога. Учитывая, что p является итератором каталога, а не файловым итератором, я предполагаю, что у вас возникнут дополнительные проблемы, когда вы получите имя в виде C-строки или std::string.

Вы должны использовать что-то вроде:

std::vector<std::string> output;
std::string str;
std::string fname = p...;

FileSource(fname.c_str(), true, new HashFilter(hash, new HexEncoder(new StringSink(str))), true);

output.push_back(str);

Понятия не имею, как получить имя файла из p, то есть std::experimental::filesystem::recursive_directory_iterator. Вот почему код просто говорит std::string fname = p...;.

Вам следует задать еще один вопрос по поводу filesystem::recursive_directory_iterator. Также смотрите Как вы рекурсивно просматриваете каждый файл / каталог в стандартном C ++?

...