0

我正在创建一个简单的Qt Bencode解析器,作为熟悉QString类的练习。

我当前的方法创建了一个 Bencode 对象,其行为类似于扫描仪,并通过递增地推进字符串指针 ( pos) 进行解析,从而生成如下所示的代码 (bEncoded是 Bencode QString ):

void Bencode::parseInteger() {
    qDebug() << "Parsing an Integer";

    if(bEncoded.at(pos) != intChar) {
        qDebug() << "No leading i for integer";
        return;
    }
    pos++;
    QString buf;
    if(bEncoded.at(pos).isNumber() || bEncoded.at(pos) == negChar) {
        buf.append(bEncoded.at(pos));
        pos++;
    }
    while(bEncoded.at(pos).isNumber()) {
        buf.append(bEncoded.at(pos));
        pos++;
    }
    if(!bEncoded.at(pos).unicode() == 'e') {
        qDebug() << "No training e for integer";
        return;
    }
    pos++;
    qDebug("Integer: %i", buf.toInt());
}

我想知道这是否是一种简洁的方法。好像我在滥用QString::at()QChar==。当我看到它时,我认为 RegEx 可能更简洁,但我想我也会在这里征求一些意见。

那么 - 如何改进这种方法?

所有代码在这里:https ://github.com/jif/Bencode

4

1 回答 1

0

所以我想我找到了一种内存密集度较低的方法。我可以使用 QString::mid() 来提取子字符串,而不是到处创建 QChar 并进行比较。例如,整数解析器变为:

int Bencode::parseInteger() {
    qDebug() << "Parsing an Integer";

    // Validate the integer
    if(currentChar() != intChar) {
        qDebug() << "No leading i for integer";
        return 0;
    }
    pos++;
    int len = bEncoded.indexOf(endChar,pos)-pos;
    if(len>0) {
        int intBuf = bEncoded.mid(pos,len).toInt();
        qDebug("Integer: %i", intBuf);
        pos = pos+len+1;
        return intBuf;
    } else {
        qDebug("Integer sytax error at %i",pos);
        return 0;
    }
}

对我来说看起来更简洁:)

于 2013-03-24T19:34:23.293 回答