我使用Crypto ++ 5.6.3,iI需要FileSource Skip(...)
功能。不幸的是,这个功能什么也没做!
以下是此function的示例。
string filename = ...;
string str;
FileSource file(filename, false, new HexEncoder(new StringSink(str)));
file.Skip(24);
file.PumpAll();
有人能帮助我吗?
答案 0 :(得分:1)
我使用Crypto ++ 5.6.3,iI需要FileSource" skip(...)函数。不幸的是,这个功能什么也没做!
我能够在OS X 10.8.5和Ubuntu 14.04上使用Master,5.6.3和5.6.2下的字符串复制它。
$ cat test.cxx
#include <string>
#include <iostream>
using namespace std;
#include <filters.h>
#include <hex.h>
using namespace CryptoPP;
int main(int argc, char* argv[])
{
string str1, str2;
HexEncoder enc(new StringSink(str1));
for(unsigned int i=0; i < 32; i++)
enc.Put((byte)i);
enc.MessageEnd();
cout << "str1: " << str1 <<endl;
StringSource ss(str1, false, new StringSink(str2));
ss.Skip(10);
ss.PumpAll();
cout << "str2: " << str2 << endl;
return 0;
}
和
$ ./test.exe
str1: 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
str2: 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
Crypto ++ 5.6.2非常重要,因为它是Wei在将库转换为社区之前所使用的最后一个版本。 5.6.2中的一个问题只是一个潜在的错误,我们偶尔会遇到它们,就像任何其他项目一样。 (&#34; Wei&#34;错误实际上很少见,而且他们更接近&#34; Knuth&#34;他的Art of Computer Programming中的错误。)
如果是5.6.3及以上的问题,则意味着社区破坏了它。如果社区破坏了它,那么我们需要进行验尸并分析我们如何/为什么设法打破以前工作的东西。
这是图书馆的错误报告:Issue 248: Skip'ing on a Source does not work。我们正试图确定它是否是一个错误;如果是的话,那么如何继续。
编辑1 :我能够更多地调查此问题。您可以在Comment 242890863阅读分析。缺点是,Skip
用于丢弃输出缓冲区(AttachedTransformation()
)上的字节,因此有点按预期工作。但是,Skip
不在Source
上工作,并且只处理附加的Filter
( qv ,我们在这里。)
我还要求Issue 248: Skip'ing on a Source does not work在邮件列表上提供一些反馈。 DB和WD立刻发现了它 - 这是图书馆的一个设计问题。
这是您目前可以使用的解决方法。实际上,您Pump()
进入了null
Filter
,它会按预期丢弃输入。然后你附上真正的过滤器链来处理真正的处理。
#include <string>
#include <iostream>
using namespace std;
#include <filters.h>
#include <hex.h>
using namespace CryptoPP;
int main(int argc, char* argv[])
{
string str1, str2;
HexEncoder enc(new StringSink(str1));
for(unsigned int i=0; i < 32; i++)
enc.Put((byte)i);
enc.MessageEnd();
cout << "str1: " << str1 <<endl;
// 'ss' has a NULL AttachedTransformation()
StringSource ss(str1, false);
ss.Pump(10);
// Attach the real filter chain to 'ss'
ss.Attach(new StringSink(str2));
ss.PumpAll();
cout << "str2: " << str2 << endl;
return 0;
}
它产生预期的输出:
$ ./test.exe
str1: 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
str2: 05060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
在您的示例程序中,我相信解决方法是:
FileSource file(filename, false);
file.Pump(24);
file.Attach(new HexEncoder(new StringSink(str)));
file.PumpAll();
编辑2 :这是一种稍微冗长的解决方法(感谢DB)。它强调了丢弃字节的观点。 TheBitBucket()
只是一个丢弃过滤器,其用途与null
AttachedTransformation()
的目的相同。
int main(int argc, char* argv[])
{
string str1, str2;
HexEncoder enc(new StringSink(str1));
for(unsigned int i=0; i < 32; i++)
enc.Put((byte)i);
enc.MessageEnd();
cout << "str1: " << str1 <<endl;
StringSource ss(str1, false, new Redirector(TheBitBucket()));
ss.Pump(10);
ss.Detach(new StringSink(str2));
ss.PumpAll();
cout << "str2: " << str2 << endl;
return 0;
}
上述程序还有另一个微妙的区别:它调用Detach
,它释放前一个过滤器链。如果你打电话给Attach
,那么前链将被分离,返回给来电者,但不是免费的。