Qt網絡數據解析方法總結

在Qt中解析網絡數據通常涉及接收原始字節流,并將其轉換為有意義的應用層數據。以下是詳細步驟和示例:

1. 網絡數據接收

使用QTcpSocketQUdpSocket接收數據,通過readyRead()信號觸發讀取:

// 創建TCP Socket并連接信號
QTcpSocket *socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::readyRead, [=](){QByteArray data = socket->readAll();processData(data);
});

2. 緩沖區管理(處理粘包/拆包)

建議使用成員變量保存未處理的數據:

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;}
};

3. 常見數據格式解析

3.1 JSON解析
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();
}
3.2 XML解析
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();}
}
3.3 自定義二進制協議
#pragma pack(push, 1)
struct CustomHeader {quint16 magic;    // 協議標識 0xABCDquint32 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);// 處理有效載荷...
}

4. 編碼處理

// 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;
}

5. 完整處理流程示例

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);}}
};

注意事項:

  1. 字節序處理:使用QDataStream時默認使用大端序,可通過setByteOrder()修改
  2. 內存管理:避免頻繁內存分配,可預分配緩沖區
  3. 超時處理:對于不完整數據包需要設置超時機制
  4. 安全驗證:校驗字段合法性(如長度字段最大值限制)
  5. 性能優化:對于高頻數據可考慮零拷貝技術(如QByteArray::fromRawData)

對于HTTP等高層協議,建議直接使用QNetworkAccessManager等高級API,避免手動解析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity編輯器的json驗證及格式化

UNITY編輯器的json格式化和驗證工具資源-CSDN文庫https://download.csdn.net/download/qq_38655924/90676188?spm1001.2014.3001.5501 反復去別的網站驗證json太麻煩了 用這個工具能方便點 # Unity JSON工具 這是一個Unity編輯器擴展&#xff0c;用于驗證、格式化和壓縮JSO…

學習筆記:Qlib 量化投資平臺框架 — FIRST STEPS

學習筆記&#xff1a;Qlib 量化投資平臺框架 — FIRST STEPS Qlib 是微軟亞洲研究院開源的一個面向人工智能的量化投資平臺&#xff0c;旨在實現人工智能技術在量化投資中的潛力&#xff0c;賦能研究&#xff0c;并創造價值&#xff0c;從探索想法到實施生產。Qlib 支持多種機器…

操作系統:計算機世界的基石與演進

一、操作系統的本質與核心功能 操作系統如同計算機系統的"總管家"&#xff0c;在硬件與應用之間架起關鍵橋梁。從不同視角觀察&#xff0c;其核心功能呈現多維價值&#xff1a; 硬件視角的雙重使命&#xff1a; 硬件管理者&#xff1a;通過內存管理、進程調度和設…

基于單片機的溫濕度采集系統(論文+源碼)

2.1系統的功能 本系統的研制主要包括以下幾項功能&#xff1a; (1)溫度檢測功能&#xff1a;對所處環境的溫度進行檢測&#xff1b; (2)濕度檢測功能&#xff1a;對所處環境的濕度進行檢測&#xff1b; (3)加熱和制冷功能&#xff1a;可以完成加熱和制冷功能。 (4)加濕和除…

webrtc使用

demo https://www.webrtc-experiment.com/ github開源demo https://github.com/muaz-khan/WebRTC-Experiment.git ws傳遞webrtc信令,本機不需要stun服務器,遠端電腦需要ice服務器建立peer連接 const WebSocket = require(ws); const express =

【數據可視化-25】時尚零售銷售數據集的機器學習可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

Python Cookbook-6.11 緩存環的實現

任務 你想定義一個固定尺寸的緩存&#xff0c;當它被填滿時&#xff0c;新加入的元素會覆蓋第一個(最老的)元素。這種數據結構在存儲日志和歷史信息時非常有用。 解決方案 當緩存填滿時&#xff0c;本節解決方案及時地修改了緩存對象&#xff0c;使其從未填滿的緩存類變成了…

OpenCv高階(九)——背景建模

目錄 一、背景建模的核心目標與核心挑戰 1. 核心目標 2. 核心挑戰 ?二、背景建模模型 1、幀差法原理 2. 概率模型&#xff08;Parametric Models&#xff09; &#xff08;1&#xff09;高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09; &#xff08;…

小重構,大收益!技術重構實踐:如何優雅升級老舊接口

重構格言&#xff1a;"優秀系統不是設計出來的&#xff0c;而是通過持續重構演進而來的。" —— Martin Fowler《重構&#xff1a;改善既有代碼的設計》 希望本文能為您的重構之旅提供指引&#xff0c;讓老舊系統煥發新生&#xff01; 一、背景&#xff1a;一個“穩定…

OSPF中DR/BDR的選舉

OSPF 開放式最短路徑優先協議-CSDN博客 選舉原因&#xff1a;廣播網絡中使路由信息交換更加高速有序&#xff0c;可以降低需要維護的鄰接關系數量 基本概念&#xff1a; DR (Designated Router, 指定路由器)&#xff1a;負責在廣播網絡&#xff08;以太網&#xff09;或NBMA網…

[特殊字符]?[特殊字符]Linux驅動開發入門 | 并發與互斥機制詳解

文章目錄 &#x1f468;?&#x1f4bb;Linux驅動開發入門 | 并發與互斥機制詳解&#x1f4cc;為什么驅動中需要并發和互斥控制&#xff1f;&#x1f4a1;常見的并發控制機制&#x1f510;自旋鎖和信號量通俗理解&#x1f300;自旋鎖&#xff08;Spinlock&#xff09;——“廁所…

Kafka 架構設計和組件介紹

什么是Apache Kafka&#xff1f; Apache Kafka 是一個強大的開源分布式事件流平臺。它最初由 LinkedIn 開發&#xff0c;最初是一個消息隊列&#xff0c;后來發展成為處理各種場景數據流的工具。 Kafka 的分布式系統架構支持水平擴展&#xff0c;使消費者能夠按照自己的節奏檢…

elk中kibana一直處于可用和降級之間且es群集狀態并沒有問題的解決方法

前言 在公司部elk的時候發現kibana的web界面一直很卡&#xff0c;數據量為0也會很卡&#xff0c;es群集狀態正常&#xff0c;資源足夠。 報錯信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…

什么是視頻上墻

視頻聯動上墻是指當監控系統中出現報警或其他特定事件時&#xff0c;相關的視頻畫面能夠自動切換并顯示在指定的監控大屏或顯示設備上&#xff0c;以便監控人員能夠快速、直觀地查看事件現場的情況&#xff0c;及時做出響應和處理。 具體介紹? 系統組成 &#xff1a;一般由前端…

26考研——存儲系統(3)

408答疑 文章目錄 一、存儲器概述二、主存儲器三、主存儲器與 CPU 的連接四、外部存儲器五、高速緩沖存儲器六、虛擬存儲器七、參考資料鮑魚科技課件26王道考研書 八、總結復習提示思考題常見問題和易混淆知識點 一、存儲器概述 文章鏈接: 點擊跳轉 二、主存儲器 文章鏈接: …

.NET 6 + Dapper + User-Defined Table Type

大家都知道&#xff0c;對于SQL Server IN是有限制條件的&#xff0c;如果IN里面的內容過多&#xff0c;在執行的時候會被自動截斷&#xff0c;因而導致查詢到的結果不是實際需要的結果。 select * from Payments where Id in (1,2,3,4,...) 為了解決上面的限制&#xff0c;可以…

MySQL 8(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 其實之前已經寫過一篇筆記【MySQL 8.0.34&#xff08;x64&#xff09;安裝筆記】。機緣巧合&#xff0c;這次遇到的環境是Ubuntu 18.04 LTS&#xff0c;相比Windows平臺的安裝&#xff0c;對mysql的版本以及依賴的選擇&#xff0c;稍微要窄一些。特作筆記。 二、準備…

學習 Apache Kafka

學習 Apache Kafka 是一個很好的選擇&#xff0c;尤其是在實時數據流處理和大數據領域。以下是一個系統化的學習建議&#xff0c;幫助你從入門到進階掌握 Kafka&#xff1a; 1. 先決條件 在開始 Kafka 之前&#xff0c;確保你具備以下基礎&#xff1a; Java 基礎&#xff1a;K…

使用 binlog2sql 閃回 MySQL8 數據

【說明】 MySQL服務器版本 8.0.26 mysql> SELECT version(); ----------- | version() | ----------- | 8.0.26 | -----------Python 版本 Python 3.8.10 [infuq ~]# python -V Python 3.8.10【安裝】 binlog2sql 官方地址 1.安裝 binlog2sql [infuq ~]# git clone …

JavaScript 異步編程與請求取消全指南

JavaScript 異步編程與請求取消全指南 涵蓋&#xff1a;同步/異步、Promise、async/await、AbortController、前后端協作 一、同步與異步 1. 同步&#xff08;Synchronous&#xff09; 定義&#xff1a;代碼按順序執行&#xff0c;前一步完成才能執行下一步。特點&#xff1…