c ++十六进制字符串到while循环中的int

时间:2015-12-28 13:25:40

标签: 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);  
  }  

期望的输出 -

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

注意 -

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)  

请帮忙

1 个答案:

答案 0 :(得分:1)

啊,&#34;的典型情况应该始终在关闭可能的范围内声明变量&#34; - 并使用错误检查!

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

通过检测任何错误,您可以避免对先前错误导致的实际问题进行故障排除。