通讯程序经常遇到需要验证某个环境的算法问题,但是特定的场景不好进入,这就需要自己去拷贝已有报文或者自己造一个报文,写简单的demo程序验证算法了。
例子如下:
QString buffStr = "68 E6 00 C3 05 00 00 21 08 23 39 00 0D 27 85 01 80 F0 01 04 00 01 04 82 06 42 FF FF FB FF FF FF FD FF FF FF FF FF FF FF FE FF FF FF FF FF FF FF BF FF FF FF FB BF FF FF FF FF FF FF FF FF FF FF FF FB FF FB FE FF EF FF FF FF FF FF EF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FD FE FF FF FF FF FB FF BF FF FF FF FF F7 7F FF FF FF FF FF FF FF BF FF FF DF FF FF FF FF FF FF FF FF EF FF FF FF FF FF FF FF FF FF FF FF FF FD FF FF FF FF FF FF FF 7F FF FF FF FF FF FF FF FF FF FF FF FF DF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF EF FF FF FF FF FF FF FF FF DD FF FF FF FF FF FF FF FE FF FF FF FF FF FF FF FF C0 00 00 09 6A 16";
QStringList bufList = buffStr.split(" ");
QByteArray arry;
arry.clear();
foreach(QString str, bufList)
{
str.prepend("0x");
arry.append(str.toInt(NULL, 16));
}
这样 arry就存了对应的报文了可以做些事情了;
举例如下:
void CalLackOfPack(QByteArray Buff, int bitLen, int step)
{
lackList.clear();
//根据bitLen计算所占用字节数;
bool IsLack = false; //是否缺包;
int ByteSize = bitLen / 8;
if ((bitLen % 8) > 0)
ByteSize += 1;
for (int i = 0; i < ByteSize; i++) //位串:从左往右解析;
{
for (int j = 7; j >= 0; j--)
{
if (0 == ((Buff[step + i] >> j) & 1))
{
int PackNum = 7 - j + (i)* 8; //todo 待校验;
if (PackNum <= 1602)
{
IsLack = true;
lackList.append(PackNum);
}
}
}
}
}
上述函数是计算文件升级缺包的;如果不这么模拟 要等文件升级结束,还要构造终端缺包的场景,耗时且得不偿失。