write方法修改输入参数
ostringstream::write method modifies input parameter
考虑下面的代码片段,它获取一些二进制数据并将其写入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
已经改变了。我试着用std::ostringstream stream(std::ios::out | std::ios::binary)
在二进制模式下打开stream
,它没有什么不同,我没有预料到它会,无论如何。
另一个事实是,每次重新运行程序时,我都会从第二个print语句获得不同的校验和。第一个哈希值总是相同的
现在,我如何将二进制数据正确地写入ostringstream?问题是否可以转换为const char*
(GetData
方法将unsigned char**
作为第一个参数)?
更新:根据评论,这里有一些更多的解释:
- 比较原始数据和写入数据的二进制差异,我看到写入数据在某些地方向右移动(24字节)。它还在最开始添加了一些字节。我还是觉得这和演员阵容有关。
-
GetData
和实际写入之间没有更多的代码。 - GetData工作正确,因为调用后的校验和是正确的(我知道校验和应该是什么)。 我不能发布可编译的代码,因为
- 系统详细信息为:gcc版本4.6.3在Ubuntu 12.04 64位
GetData
。这是没有必要的,我已经将问题隔离到调用write
的行。问题的奥秘原来在于数据的大小。
在实验了不同的大小值后,发现ostringstream
的内部缓冲区大约是65KB,确切地说是65504字节。当大小较大时,会出现奇怪的移位和残缺的字节。
stream.rdbuf()->pubsetbuf((const char*)payload, payloadSize)
代替write
方法。但是当这个作用域终止时,有效载荷将失效,stream
不能再在其他任何地方使用。在我的例子中,它需要在其他地方使用。
这表明:
- 我确实是对的,问题是与
ostringstream
,但不是与哈希或其他任何东西。 STL的字符串流显然有默认的缓冲区大小限制。这是将来要记住的。
相关文章:
- 将输入参数作为右值引用传递?
- 是否可以在命令行中将输入参数传递给可执行文件
- 用户输入作为参数C++
- C++基于输入参数的动态代码生成
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 如何使用输入参数作为文件的传递?
- 如何设置默认参数以防用户不输入另一个参数
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 在未显式传递参数时默认使用 lambda 的用户输入
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- 如何使输入文本文件成为构造函数参数?c++
- 函数的函数无法识别输入参数
- C++ Catch 是否有类似 NUnit 的测试用例的东西,具有多个参数/输入选项
- 具体参数输入
- 为什么在参数输入之前将计算放置在代码中时,计算不起作用
- C 函数通过指针通过参考与参数输入参数
- 将命令行参数输入文件传递给要分析的类
- 将命令作为参数输入到另一个应用程序