考虑以下代码片段,它获取一些二进制数据并将其写入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**
作为第一个参数)?
更新:根据评论,这里有一些解释:
GetData
与实际写作之间不再有代码。GetData
,我无法发布可编辑的代码。并且没有必要,我已将问题隔离到调用write
的行。答案 0 :(得分:0)
问题的奥秘就是数据的大小。
在尝试使用不同大小的值后,发现ostringstream
的内部缓冲区大约为65KB,准确度为65504字节。当尺寸更大时,会发生奇怪的移位和残缺的字节。
解决方法是使用:
stream.rdbuf()->pubsetbuf((const char*)payload, payloadSize)
而不是write
方法。但是当此范围终止时,有效负载将失效,并且stream
不能再在其他任何地方使用。就我而言,它需要在其他地方使用。
这表明:
ostringstream
上,而不是哈希或其他任何问题。