给定文件名,如何使用Crypto ++获取Adler32
题
给定“字符串文件名”,如何使用C ++ Crypto ++库获取Adler32校验和。我对使用他们的Source and Sink系统感到有点困惑。
下面我有代表MD5的代码框架,但我似乎无法找到有关Adler32用法的任何示例或教程。
string filename = "/tmp/data.txt"
string file_adler32_digest;
string file_md5_digest;
MD5 hashMD5;
FileSource fs( filename.c_str(),
true,
new HashFilter( hashMD5,
new HexEncoder( new StringSink( file_md5_digest ) ) ) );
/* Confusion begins here */
//how do I do the adler32 ?
/* Confusion ends here */
cout << file_adler32_digest << endl
<< file_md5_digest << endl;
此处有良好的示例和示例代码 http://www.cryptopp.com/wiki/Category :所有Crypto ++的示例(除了我想要的Adler32内容)
解决方案
如果您关注此 http://www.cryptopp.com/wiki/HashFilter ,你必须为hashAdler32更改hashMD5,为file_adler32_digest更改file_md5_digest
Adler32 hashAdler32;
FileSource( filename.c_str(),
true,
new HashFilter( hashAdler32,
new HexEncoder( new StringSink( file_adler32_digest ) ) ) );
此 file_adler32_digest
之后应包含所需的哈希值。
其他提示
..使用他们的Source and Sink系统有点困惑。
行。这个特殊的设计灵感来自Unix管道系统。如果您了解Unix管道以及doata如何流经它,那么您就可以理解 Crypto ++ Pipeline 。
例如,以下Unix命令:
cat somefile.bin | hexdump
将成为以下Crypto ++程序:
FileSource fs("somefile.bin", true /*pumpAll*/, new HexEncoder(new FileSink(cout)));
我有代码的骨架做MD5,但我需要代码......对于Adler32 ......
正如伊斯梅尔向你展示的那样简单:
Adler32 adler32;
string digest;
FileSource fs(filename.c_str(), true /*pumpAll*/,
new HashFilter(adler32,
new HexEncoder(
new StringSink(digest))));
但是这里的见解是:在Crypto ++中,数据从来源流向 Sinks 。在这两者之间,它将遇到转换数据的过滤器。
上面,您有两个过滤器: HashFilter 和 HexEncoder 。所有过滤器都继承自 BufferedTransformation
,因此它们都可以链接以一致的方式在一起。
Adler32
本身不是过滤器。但它继承自 HashTransformation
,这就是 HashFilter 使用。因此,您可以交换任何基于HashFilter 的对象,事情就可以正常工作。
您可以在基于HashFilter 的对象列表/www.cryptopp.com/docs/ref/class_hash_transformation.html“rel =”nofollow“> HashTransformation类参考。它们包括所有哈希值(如MD5,SHA和Whirlpool),Adler32和CRC32。