2013-03-24 94 views
0

我正在創建一個簡單的QtBencode解析器作爲熟悉QString類的練習。Qt解析本代碼的方法

我目前的做法創建具有像掃描儀的行爲一個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

回答

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

看起來更簡潔,以我:)