2015-12-28 2 views
-2

Привет У меня есть часть в коде, как -C++ шестнадцатеричной строки в целое, в то время как цикл

suppose len = 000000088805C24307142C690000000B6274626D6131333230736D0000000D322E31332E31302D313530333400000004000000E6 

    string len, remainder; 
    int numLen; 
    stringstream stream; 
    while(remainder!="NULL") 
    { 
    len = trim(remainder.substr(0,8), '0'); 
    if(len.empty()) 
     len = "0"; 
    stream << len; 
    stream >> hex >> numLen; //problem in this part 
    numLen = (numLen*2); 
    TS << "DATA  : 0x" << remainder.substr(0,8) << " " << remainder.substr(8,numLen) << endt; 
    remainder = remainder.substr(8+numLen); 
    } 

желаемому output--

DATA  : 00000008 8805C24307142C69 
DATA  : 0000000B 6274626D6131333230736D 
DATA  : 0000000D 322E31332E31302D3135303334 
DATA  : 00000004 000000E6 

note--

Len является в шестнадцатеричном формате, я конвертирую его в dec и сохраняю в numLen

при расчете len все хорошо в первом цикле, но из второго цикла значение для numLen не перезаписывается, а использует старое значение, которое вызывает проблему.

EG-

first loop numLen = 8 
numLen*2 = 16 



second loop numLen = 16 (expected here is 11) 
numLen*2 = 32 (expected here is 22) 

Пожалуйста, помогите

+0

'second loop numLen = 16 (ожидается здесь 11)' Как ожидается 11 во втором цикле? – NathanOliver

+0

B is hex ... dec for is 11 –

+0

Любой шанс, что вы действительно можете написать COMPLETE-программу, которая делает все, - думаю, ваш код делает что-то неправильно вне кода, который вы разместили ... –

ответ

1

Ах, типичный случай «должен всегда объявлять переменные на закрытие возможный объем» - и использовать проверку ошибок!

while(remainder!="NULL") 
    { 
    stringstream stream; 
    len = trim(remainder.substr(0,8), '0'); 
    if(len.empty()) 
     len = "0"; 
    stream << len; 
    stream >> hex >> numLen; //problem in this part 
    numLen = (numLen*2); 
    TS << "DATA  : 0x" << remainder.substr(0,8) << " " << remainder.substr(8,numLen) << endt; 
    remainder = remainder.substr(8+numLen); 
    } 

Перемещение stringstream stream; в петлю - проблема в том, что вы читали все в stream в первый раз, поэтому в следующий раз, он считает, что строка в конце. Когда он затем пытается прочитать следующие данные в numLen, он идет не так и просто удваивает существующее значение numLen.

В качестве альтернативы, используйте stream.clear() где-то после stream >> numLen;.

Лично я бы переместить все переменные в цикле, и в конечном итоге с чем-то вроде этого:

while(remainder!="NULL") 
    { 
    std::string len = trim(remainder.substr(0,8), '0'); 
    if(len.empty()) 
     len = "0"; 
    stringstream stream(len); 
    int numLen = 0; 
    if (stream >> hex >> numLen) 
    { 
     numLen = (numLen*2); 
     TS << "DATA  : 0x" << remainder.substr(0,8) << " " << remainder.substr(8,numLen) << endt; 
     remainder = remainder.substr(8+numLen); 
    } 
    else /* handle error in some way */; 
    } 

При обнаружении какой-либо ошибки, вы избежите устранения неполадок что-то, что было на самом деле, вызванную ранее ошибки.

+0

ahh я вижу ... глупая ошибка большое спасибо –

Смежные вопросы