哈希文件递归并保存到向量 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;
我收到这个错误
- 说明
没有构造函数的实例 "CryptoPP::FileSource::FileSource" 匹配参数列表
- 说明
没有构造函数的实例 "CryptoPP::StringSinkTemplate::StringSinkTemplate [with T=std::string]" 匹配参数列表
- 说明
'CryptoPP::StringSinkTemplate::StringSinkTemplate(const CryptoPP::StringSinkTemplate &)': 无法将参数 1 从 'std::vector>' 转换为 'T &'
- 说明
'': 无法从 '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++?
我想获取哈希文件。在当前路径中有 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;
我收到这个错误
- 说明 没有构造函数的实例 "CryptoPP::FileSource::FileSource" 匹配参数列表
- 说明 没有构造函数的实例 "CryptoPP::StringSinkTemplate::StringSinkTemplate [with T=std::string]" 匹配参数列表
- 说明 'CryptoPP::StringSinkTemplate::StringSinkTemplate(const CryptoPP::StringSinkTemplate &)': 无法将参数 1 从 'std::vector>' 转换为 'T &'
- 说明 '': 无法从 '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++?