在源上跳过不能按预期工作

时间:2016-08-26 12:11:48

标签: c++ crypto++

我使用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();

有人能帮助我吗?

1 个答案:

答案 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,那么前链将被分离,返回给来电者,但不是免费的。