将std :: ostream转换为某个数组?

时间:2011-06-27 13:47:08

标签: qt stl iostream

我有一个遗留库,它从硬件中获取数据并将其写入ostream。 该方法如下所示:

int sensors(ostream*) const;

我对古代方法不够熟练。如何将此数据转换为QByteArray?或者,至少,char已知大小的数组? 我自己会解决它,但是还有一个问题:ostream中的数据似乎是任意长度并且有几个任意'\0'个符号,所以你不能指望它是以null结尾的。

2 个答案:

答案 0 :(得分:1)

我认为这就是OrcunC所得到的:

std::stringstream s;
sensors( &s );
QByteArray( s.str().data(), (int) s.str().size() );

...但希望更清楚:)。有关此处使用的类/成员函数的信息,另请参阅std::stringstreamstd::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,这是字节数组的额外副本。