【问题标题】:Reading unsingned chars with Qt使用 Qt 读取无符号字符
【发布时间】:2012-12-17 00:31:47
【问题描述】:

大家好,堆栈溢出者,

我目前正在解析一个同时包含文本和二进制数据的文件。目前,我正在通过以下方式读取文件:

QTextStream in(&file);

int index = 0;
while(!in.atEnd()) {
    if (index==0) {
        QString line = in.readLine(); // parse file here
    } else {
        QByteArray raw_data(in.readAll().toAscii());
        data = new QByteArray(raw_data);
    }
    index++;
}

其中 data 指的是我正在寻找的二进制数据。我不确定这是否是我想要的,因为 QString 被编码为 ascii,我不知道是否丢失了一些字节。

我查看了文档,它建议使用 QDataStream。如何将这两种方法结合起来,即在换行后读取带有编码的行并读取二进制转储?

非常感谢您的帮助!

【问题讨论】:

    标签: file qt binary


    【解决方案1】:

    这会做你想做的。

    QTextStream t(&in);
    QString line;
    QByteArray raw_data;
    if(!in.atEnd()) {line = t.readLine();}
    in.reset();
    int lineSize = line.toLocal8Bit().size() + 1;
    in.seek(lineSize);
    if(!in.atEnd())
    {
        int len = in.size() - lineSize;
        QDataStream d(&in);
        char *raw = new char[len]();
        d.readRawData(raw, len);
        raw_data = QByteArray(raw, len);
        delete raw;
    }
    

    PS:如果文件格式是你的,最好用QDataStream创建文件,用<<写数据,用>>读数据。这样您就可以将QByteArrayQString 存储在文件中而不会出现此类问题。

    【讨论】:

    • 以上代码包含错误:调用 in.size() 是不可能的,因为 QTextStream 不提供上述方法。还有转换: QDataStream d(&in);也会导致错误。
    • in 不是QTextStreaminQFileQTextStream t(在我的代码示例中)
    • 好的,谢谢!假设你使用了我的变量名。它现在似乎起作用了。谢谢!
    • 您知道在 QByteArray 中保存无符号字符与保存字符是否有区别吗?
    • 为什么要重置?附加 QDataStream 应该从 QTextStream 停止的地方开始。
    猜你喜欢
    • 2012-12-18
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2010-10-10
    相关资源
    最近更新 更多