网站建设与管理专业的行业发展,网站关键词引流,可视化建站工具,苏州高新区建设局网站管网这是一个 CPacket 类#xff0c;用于解析包含固定格式的数据。该类的成员变量包括固定包头 sHead、包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。
构造函数#xff1a;
CPacket()#xff1a;默认构造函数#xff0c;初始化成员变量。
CPacket(const B…这是一个 CPacket 类用于解析包含固定格式的数据。该类的成员变量包括固定包头 sHead、包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。
构造函数
CPacket()默认构造函数初始化成员变量。
CPacket(const BYTE* pData, size_t nSize)参数化构造函数用于解析传入的数据pData并根据解析结果更新传入的数据大小nSize。如果解析成功nSize 将被更新为实际有效数据的大小。
解析包数据
通过循环遍历传入的数据查找固定包头 0xFEFF 的位置。 如果找到包头解析包的其他字段包括包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。 在解析过程中对包数据的完整性进行了检查确保包头和其他字段都能正确解析。 如果包的数据完全接收并且和校验通过更新传入的 nSize 为实际解析的包大小。
class CPacket
{
public:CPacket() :sHead(0),nLength(0),sCmd(0),sSum(0) {}// 解析包数据CPacket(const BYTE* pData, size_t nSize) {size_t i 0;for (; i nSize; i) {if (*(WORD*)(pData i) 0xFEFF) {sHead *(WORD*)(pData i);i sizeof(WORD);break;}}// 包数据可能不全或者包头未能全部接受到if ((i sizeof(DWORD) sizeof(WORD) sizeof(WORD)) nSize) {nSize 0;return;}nLength *(DWORD*)(pData i); i sizeof(DWORD);// 包未完全接受解析失败if (nLength i nSize) {nSize 0;return;}sCmd *(WORD*)(pData i); i sizeof(WORD);if (nLength sizeof(WORD) * 2) {strData.resize(nLength - sizeof(WORD) * 2);memcpy((void*)strData.c_str(), pData i, nLength - sizeof(WORD) * 2);i nLength - sizeof(WORD) * 2;}sSum *(WORD*)(pData i);WORD sum 0;for (size_t j 0; j strData.size(); j) {sum BYTE(strData[j]) 0xff;}if (sum sSum) {nSize nLength sizeof(WORD) sizeof(nLength);return;}nSize 0;//解析失败}~CPacket() {}
private:WORD sHead;//固定包头 0xFEFFDWORD nLength;//包长度控制命令到和校验WORD sCmd;//控制命令std::string strData;//包数据WORD sSum;//和校验
};