Подход для разбора Qt Bencode

Я создаю простую Qt Bencode парсер как упражнение, чтобы познакомиться с QString учебный класс.

Мой текущий подход создает объект Bencode с поведением, похожим на сканер, и анализирует, постепенно продвигая указатель строки (pos), в результате чего код выглядит следующим образом (bEncoded это бенкод 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

0

Решение

Поэтому я думаю, что нашел несколько менее интенсивный подход к памяти. Вместо того, чтобы создавать QChar повсюду и делать сравнения, я могу использовать QString :: mid () для извлечения подстрок. Например, целочисленный парсер становится:

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;
}
}

Выглядит более лаконично для меня 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]