ostringstream :: write方法修改输入参数

时间:2013-05-21 08:44:57

标签: c++ binary-data ostringstream

考虑以下代码片段,它获取一些二进制数据并将其写入ostringstream对象:

unsigned char* payload;
unsigned long  size;

GetData(&payload, &size);

std::cout << md5(payload, size) << std::endl;

std::ostringstream stream;
stream.write((const char*)payload, size);

std::cout << md5(payload, size) << std::endl;

问题在于,两个打印的哈希值彼此不同,这意味着payload已被更改。我尝试使用stream以二进制模式打开std::ostringstream stream(std::ios::out | std::ios::binary),它没有任何区别,无论如何我都没想到会这样。

另一个事实是,每次重新运行程序时,我从第二个print语句得到一个不同的校验和。第一个哈希值始终相同。

现在,我如何正确地将二进制数据写入ostringstream?可以将问题转化为const char*GetData方法将unsigned char**作为第一个参数)?

更新:根据评论,这里有一些解释:

  • 比较原始数据的二进制差异和写入的数据,我看到在某些地方写入的数据已经向右移动(24字节)。在开始时它还有一些额外的字节。我仍然认为这与演员有关。
  • GetData与实际写作之间不再有代码。
  • GetData工作正常,因为调用后的校验和是正确的(我知道校验和应该是什么)。
  • 由于GetData,我无法发布可编辑的代码。并且没有必要,我已将问题隔离到调用write的行。
  • 系统详细信息为:Ubuntu 12.04 64位上的gcc版本4.6.3

1 个答案:

答案 0 :(得分:0)

问题的奥秘就是数据的大小。

在尝试使用不同大小的值后,发现ostringstream的内部缓冲区大约为65KB,准确​​度为65504字节。当尺寸更大时,会发生奇怪的移位和残缺的字节。

解决方法是使用:

stream.rdbuf()->pubsetbuf((const char*)payload, payloadSize)

而不是write方法。但是当此范围终止时,有效负载将失效,并且stream不能再在其他任何地方使用。就我而言,它需要在其他地方使用。

这表明:

  • 我确实认为问题出在ostringstream上,而不是哈希或其他任何问题。
  • STL的字符串流显然具有默认的缓冲区大小限制。这将在未来被记住。