我有一个遗留库,它从硬件中获取数据并将其写入ostream
。
该方法如下所示:
int sensors(ostream*) const;
我对古代方法不够熟练。如何将此数据转换为QByteArray
?或者,至少,char
已知大小的数组?
我自己会解决它,但是还有一个问题:ostream中的数据似乎是任意长度并且有几个任意'\0'
个符号,所以你不能指望它是以null结尾的。
答案 0 :(得分:1)
我认为这就是OrcunC所得到的:
std::stringstream s;
sensors( &s );
QByteArray( s.str().data(), (int) s.str().size() );
...但希望更清楚:)。有关此处使用的类/成员函数的信息,另请参阅std::stringstream和std::string。顺便说一下,请注意我使用的是str()。data(),而不是str()。c_str() - 我真的很小心处理那些\0
个字符,而且我不是假设NULL终止。
答案 1 :(得分:0)
您可以继承std :: ostream的子类,并使用子类的对象将字节收集到QByteArray中。
/**
* This helper class collects bytes that are passed to it
* into a QByteArray.
*
* After https://stackoverflow.com/a/19933011/316578
*/
class QByteArrayAppender : public std::ostream, public std::streambuf {
private:
QByteArray &m_byteArray;
public:
QByteArrayAppender(QByteArray &byteArray)
: std::ostream(this),
std::streambuf(),
m_byteArray(byteArray) {
}
int overflow(int c) {
m_byteArray.append(static_cast<char>(c));
return 0;
}
};
这避免了通过std :: string,这是字节数组的额外副本。