- void TcpClient::rcvSlot()
- {
- static QByteArray allBa; // 用来存所有文件
- allBa.append(tcpClient->readAll()); // 读取数据
- int head = allBa.indexOf(HEAD); // 报文头的位置, HEAD=0x55aa
- uint16_t length = 0; // 报文 (协议中) 的长度
- QByteArray currentBa;
- int id = 0;
- while (-1 != head) // 报文头检验
- {
- allBa = allBa.mid(head); // 去掉报头之前的
- memcpy(&length, allBa.data() + 2, 2);
- if (allBa.size()>= length) // 长度够, 进行解析. 报文长度校验
- {
- currentBa = allBa.mid(0, length); // 获取当前完整包
- id = Mymethod:isCRC(currentBa); // 报文的和校验和 id 校验.(这里的 id 不小于 0,Mymethod:isCRC 返回命令 id, 校验通过返回大于 0, 异常返回 - 1)
- if (-1 != id)
- {
- emit getPacketSignal(id, currentBa);
- allBa = allBa.mid(length);
- qDebug() << "接收指令:" << currentBa.toHex().toUpper();
- }
- }
- head = allBa.indexOf(HEAD); // 刷新报文头的位置
- }
- }
来源: https://www.cnblogs.com/xian-yongchao/p/9488847.html