哈希文件递归并保存到向量 Cryptopp

Hash file recursive and save into vector Cryptopp

我想获取哈希文件。在当前路径中有 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. 说明 'CryptoPP::StringSinkTemplate::StringSinkTemplate(const CryptoPP::StringSinkTemplate &)': 无法将参数 1 从 'std::vector>' 转换为 'T &'
  4. 说明 '': 无法从 'initializer list' 转换为 'CryptoPP::FileSource'

`

将您的代码精简到最基本的部分:

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>。另请参阅 Crypto++ 手册中的 StringSink

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 的问题。另见 How do you iterate through every file/directory recursively in standard C++?