0

考虑以下片段,它获取一些二进制数据并将其写入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)打开,它没有任何区别,我没想到它会,无论如何。

另一个事实是,每次我重新运行程序时,我都会从第二个打印语句中得到不同的校验和。第一个哈希总是相同的。

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

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

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

1 回答 1

0

问题的奥秘原来是数据的大小。

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

解决方法是使用:

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

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

这表明:

  • 我确实是对的,问题ostringstream出在哈希或其他任何东西上,但不是。
  • STL 的字符串流显然有一个默认的缓冲区大小限制。这是以后要记住的。
于 2013-05-21T14:20:20.543 回答