嗨,我参与了代码 -
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)
请帮忙
答案 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 */;
}
通过检测任何错误,您可以避免对先前错误导致的实际问题进行故障排除。