我正在创建一个简单的Qt Bencode解析器,以便熟悉QString类。
我当前的方法创建一个Bencode对象,其行为类似于扫描程序,并通过逐步推进字符串指针(pos
)进行解析,从而产生如下代码(bEncoded
是Bencode {{3 }}):
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可能更简洁,但我想在这里也会提出一些意见。
那么 - 如何改进这种方法呢?
此处的所有代码:QString
答案 0 :(得分: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;
}
}
对我来说更简洁:)