42人参与 • 2025-04-28 • C/C++
使用qtcpsocket或qudpsocket接收数据,通过readyread()信号触发读取:
// 创建tcp socket并连接信号 qtcpsocket *socket = new qtcpsocket(this); connect(socket, &qtcpsocket::readyread, [=](){ qbytearray data = socket->readall(); processdata(data); });
建议使用成员变量保存未处理的数据:
class networkhandler : public qobject { qbytearray m_buffer; // 类成员变量 private slots: void onreadyread() { m_buffer += socket->readall(); while(parsebuffer()); // 循环解析 } bool parsebuffer() { if(m_buffer.size() < 4) return false; // 示例:假设前4字节是长度头 quint32 packetlength; qdatastream ds(m_buffer); ds >> packetlength; if(m_buffer.size() < packetlength + 4) return false; qbytearray packet = m_buffer.mid(4, packetlength); handlepacket(packet); m_buffer.remove(0, packetlength + 4); return true; } };
void parsejson(const qbytearray &data) { qjsonparseerror error; qjsondocument doc = qjsondocument::fromjson(data, &error); if(error.error != qjsonparseerror::noerror) { qdebug() << "json error:" << error.errorstring(); return; } qjsonobject obj = doc.object(); qstring value = obj["key"].tostring(); }
void parsexml(const qbytearray &data) { qxmlstreamreader xml(data); while(!xml.atend()) { xml.readnext(); if(xml.isstartelement()) { if(xml.name() == "item") { qstring attr = xml.attributes().value("id").tostring(); } } } if(xml.haserror()) { qdebug() << "xml error:" << xml.errorstring(); } }
#pragma pack(push, 1) struct customheader { quint16 magic; // 协议标识 0xabcd quint32 length; // 数据部分长度 quint8 version; // 协议版本 }; #pragma pack(pop) void parsecustomprotocol(const qbytearray &data) { if(data.size() < sizeof(customheader)) return; customheader header; memcpy(&header, data.constdata(), sizeof(header)); if(header.magic != 0xabcd) return; qbytearray payload = data.mid(sizeof(header), header.length); // 处理有效载荷... }
// utf-8转换示例 qstring decodestring(const qbytearray &data) { qtextcodec *codec = qtextcodec::codecforname("utf-8"); return codec->tounicode(data); } // 处理二进制数据 void processbinary(const qbytearray &data) { qdatastream stream(data); stream.setbyteorder(qdatastream::littleendian); quint32 num; qstring str; stream >> num >> str; }
class networkprocessor : public qobject { qtcpsocket *socket; qbytearray buffer; public: networkprocessor() { socket = new qtcpsocket(this); connect(socket, &qtcpsocket::readyread, this, &networkprocessor::readdata); } private slots: void readdata() { buffer += socket->readall(); while(true) { if(buffer.size() < 4) return; quint32 packetlength; qdatastream ds(buffer); ds >> packetlength; if(buffer.size() < packetlength + 4) return; qbytearray packet = buffer.mid(4, packetlength); processpacket(packet); buffer.remove(0, packetlength + 4); } } void processpacket(const qbytearray &packet) { // 根据协议类型选择解析方式 if(isjsonprotocol(packet)) { parsejson(packet); } else if(isbinaryprotocol(packet)) { parsebinary(packet); } } };
对于http等高层协议,建议直接使用qnetworkaccessmanager等高级api,避免手动解析。
到此这篇关于qt实现网络数据解析的方法总结的文章就介绍到这了,更多相关qt数据解析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论