使用 Qt 读取无符号字符

Posted

技术标签:

【中文标题】使用 Qt 读取无符号字符【英文标题】:Reading unsingned chars with 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。如何将这两种方法结合起来,即在换行后读取带有编码的行并读取二进制转储?

非常感谢您的帮助!

【问题讨论】:

【参考方案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 停止的地方开始。

以上是关于使用 Qt 读取无符号字符的主要内容,如果未能解决你的问题,请参考以下文章

从文件中读取文本到无符号字符数组

C++ 使用 istringstream 将整数读取为无符号字符

如何在c中读取由空格分隔的无符号字符

ifstream::read 不读取无符号字符,即使使用 reinterpret_cast

C ++从文件流中读取无符号字符

从长度为无符号整数的 ByteBuffer 中读取 UTF-8 字符串