【Qt】QByteArray詳解

QByteArray 是 Qt 框架中用于處理原始字節數據的核心類,其實質可以概括為以下幾點:


1. 底層數據結構

? 連續內存塊:存儲一段連續的字節數據(char*),類似 std::vector<char>,但針對 Qt 框架做了優化。
? 自動內存管理:內部自動分配和釋放內存,無需手動管理。
? 隱式共享(寫時復制):使用 Implicit Sharing 技術,多個 QByteArray 對象共享同一份數據,直到修改時才進行深拷貝,以節省內存和計算資源。


2. 核心特性

? 二進制數據支持:可存儲任意二進制數據(如圖片、音頻、協議數據),不依賴字符編碼。
? 與 C 字符串兼容:數據默認以 \0 結尾,可通過 data()constData() 直接獲取 const char* 指針,方便與 C 函數交互。
? 動態大小:支持動態擴容(如 append()resize()),無需預分配固定大小。


3. 主要用途

? 網絡通信:序列化/反序列化數據(如通過 QNetworkRequest 發送二進制內容)。
? 文件 I/O:讀寫二進制文件(如 QFile::readAll() 返回 QByteArray)。
? 編碼轉換:作為 QString 與編碼(如 UTF-8、Latin-1)之間的橋梁(例如 QString::toUtf8() 返回 QByteArray)。
? 加密/哈希:處理加密后的二進制結果(如 QCryptographicHash 的哈希值)。


4. 與 QString 的區別

特性QByteArrayQString
數據本質原始字節(charUnicode 字符(QChar,UTF-16)
編碼感知無(直接處理字節)有(自動處理 Unicode 轉換)
適用場景二進制數據、協議、文件文本處理、用戶界面顯示
C 字符串兼容性直接兼容(data()需轉換(toUtf8()

5. 關鍵方法示例

// 創建并初始化
QByteArray data("Hello");  // 內容: 'H' 'e' 'l' 'l' 'o' '\0'// 追加數據
data.append(0x41);         // 追加字節 0x41(ASCII 'A')// 獲取指針
const char* cstr = data.constData(); // 指向 "HelloA\0"// 轉換為十六進制字符串
QByteArray hex = data.toHex(); // "48656c6c6f41"// 內存共享驗證
QByteArray copy = data;    // 隱式共享,不復制數據
copy[0] = 'h';             // 觸發寫時復制,data 和 copy 數據分離

6. 性能與注意事項

? 高效操作:避免頻繁調用 data() 獲取指針,可能導致隱式共享分離。
? 二進制安全:可包含 \0 字節,size() 返回實際數據長度(不包括結尾的 \0)。
? 編碼轉換:與 QString 互轉時需明確編碼(如 fromUtf8()toLatin1())。


常用接口
QByteArray::fromHex() 的輸入參數類型是 QByteArray


詳細說明

? 函數簽名

static QByteArray QByteArray::fromHex(const QByteArray &hexEncoded);

輸入必須是一個 QByteArray 對象。

? 常見用法
? 直接傳入 QByteArray
cpp QByteArray hexData = "48656c6c6f"; // 十六進制字符串 QByteArray data = QByteArray::fromHex(hexData);
? 若使用 QString 作為輸入,需先轉換為 QByteArray(例如用 toLatin1()toUtf8()):
cpp QString hexStr = "48656c6c6f"; QByteArray data = QByteArray::fromHex(hexStr.toLatin1());


參數要求

  1. 內容必須是有效的十六進制字符串
    ? 僅允許字符 0-9a-fA-F
    ? 其他字符(如空格、gx 等)會被自動忽略。

  2. 處理奇數字符長度
    ? 如果輸入字符串長度為奇數,fromHex() 會自動在最前面補零,使其成為偶數長度。
    ? 例如:輸入 "123" 會被當作 "0123" 解析。


示例

// 示例1:直接使用 QByteArray
QByteArray hex1 = "31393231"; // 對應 "19121" 的十六進制
QByteArray a1 = QByteArray::fromHex(hex1);
// 結果: a1 = "19121", size = 5// 示例2:使用 QString 轉換
QString hexStr2 = "31393231";
QByteArray a2 = QByteArray::fromHex(hexStr2.toUtf8());
// 結果: a2 = "19121", size = 5// 示例3:奇數字符長度
QByteArray hex3 = "abc"; // 奇數長度
QByteArray a3 = QByteArray::fromHex(hex3);
// 解析為 "0abc",結果: a3 = "\x0a\xbc"

常見錯誤

? 直接傳遞 QString

QString hexStr = "31393231";
QByteArray data = QByteArray::fromHex(hexStr); // 錯誤!類型不匹配

必須先將 QString 轉換為 QByteArray(例如 hexStr.toLatin1())。

? 包含非十六進制字符

QByteArray hexData = "1g2h"; // 'g' 和 'h' 無效
QByteArray data = QByteArray::fromHex(hexData); // 自動忽略無效字符,解析為 "12"

QByteArray::fromHex() 的補零規則:
QByteArray a = QByteArray::fromHex(QString::toLatin1("19121"));size 為 3


詳細步驟解析

  1. 輸入字符串處理
    ? QString::toLatin1("19121") 將字符串 "19121" 轉換為 Latin-1 編碼的 QByteArray,其字節內容為 0x31 0x39 0x31 0x32 0x31(對應 ASCII 字符 '1' '9' '1' '2' '1')。

  2. fromHex() 的轉換規則
    ? fromHex() 將輸入的字符串視為十六進制編碼數據,每兩個字符轉換成一個字節
    ? 若輸入長度為奇數,自動在最前面補零使其成為偶數長度。
    ? 對于輸入 "19121"(長度為 5,奇數):
    ? 補零后等效于 "019121"(長度為 6,偶數)。
    ? 分組為 "01""91""21"

  3. 轉換結果
    ? "01"0x01
    ? "91"0x91
    ? "21"0x21
    ? 最終 QByteArray a 包含 3 字節:[0x01, 0x91, 0x21],故 a.size() = 3


驗證代碼

QByteArray hexData = QString::toLatin1("19121"); // 內容: "19121" (5字節)
QByteArray a = QByteArray::fromHex(hexData);
qDebug() << a.size(); // 輸出: 3
qDebug() << a.toHex(); // 輸出: "019121"(實際存儲的字節為 0x01 0x91 0x21)

關鍵點

? fromHex() 的輸入必須是有效的十六進制字符(0-9a-fA-F),其他字符會被忽略。
? 補零規則確保奇數字符串能正確解析,避免數據截斷。

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

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

相關文章

Stable Diffusion vue本地api接口對接,模型切換, ai功能集成開源項目 ollama-chat-ui-vue

1.開啟Stable Diffusion的api服務 編輯webui-user.bat 添加 –api 開啟api服務&#xff0c;然后保存啟動就可以了 2.api 文檔地址 http://127.0.0.1:7860/docs3. 文生圖 接口 地址 /sdapi/v1/txt2img //post 請求入參 {enable_hr: false, // 開啟高清hrdenoising_stre…

CentOS 7 部署RuoYi 項目

換源 備份現有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默認的 CentOS 官方鏡像源替換為阿里云的鏡像源&#xff0c;以提高下載速度和穩定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

從 WPF 到 MAUI:跨平臺 UI 開發的進化之路

一、引言 在軟件開發領域&#xff0c;用戶界面&#xff08;UI&#xff09;開發一直是至關重要的環節。隨著技術的不斷發展&#xff0c;開發者對于創建跨平臺、高性能且美觀的 UI 需求日益增長。Windows Presentation Foundation&#xff08;WPF&#xff09;和 .NET Multi - pl…

C++ stack容器總結

stack 基本概念 概念&#xff1a; stack是一種后進先出(Last In First Out, LIFO)的數據結構&#xff0c;它只有一個出口 棧中只有頂端的元素才可以被外界使用&#xff0c;因此棧不允許有遍歷行為 棧中進入的數據稱為----入棧&#xff08;PUSH&#xff09; 棧中出去的數據成…

【SDMs分析1】基于ENMTools R包的生態位分化分析和圖像繪制(identity.test())

基于ENMTools包的生態位分化 1. 寫在前面2. 生態位分化檢驗案例13. 生態位分化檢驗案例21. 寫在前面 最近學了一個新的內容,主要是關于兩個物種之間生態位分化檢驗的 R 語言代碼。生態位分化是物種分布模型(SDM )研究中的關鍵部分,許多 SCI 論文都會涉及這一分析。該方法主…

SpringBoot 7 種實現 HTTP 調用的方式

1. HttpClient HttpClient是Apache基金會提供的一個用于發送HTTP請求的Java客戶端庫。 盡管它功能強大&#xff0c;但由于其API設計較為復雜且包體積龐大&#xff0c;在一些輕量級的應用場景中可能顯得過于臃腫。 不過&#xff0c;在需要高度定制化的HTTP請求時&#xff0c;H…

Ubuntu與Windows之間相互復制粘貼的方法

一、打開Ubuntu終端 二、卸載已有的工具 sudo apt-get autoremove open-vm-tools 三、安裝工具 sudo apt-get install open-vm-tools-desktop 四、重啟 直接輸入reboot 注&#xff1a;有任何問題歡迎評論區交流討論或者私信&#xff01;

ECharts實現數據可視化

ECharts實現數據可視化 一、Echarts的簡介二、Echarts使用教程1.下載echarts.min.js文件2.編寫echarts代碼&#xff08;1&#xff09;創建渲染實列&#xff08;2&#xff09;修改option達到預期的效果&#xff08;3&#xff09;創建配置項到實例中 三、Echarts的基礎配置四、前…

ArcGIS 10.8.1之后發布柵格數據的MapServer 動態工作空間 替換數據源渲染問題

背景 經過測試&#xff0c;Server 10.8.1、11.0、11.1發布相關服務設置動態空間之后&#xff0c;前端都無法自動讀取同名的clr色彩映射表文件進行渲染&#xff0c;服務都是由ArcGIS Pro進行發布。 原因 基于ArcMap發布的服務才支持&#xff0c;但是10.8.1之后不支持ArcMap發…

vscode在使用 alt + tab 切換程序窗口時,輸入法總是自動變為中文模式

因為需要在 vscode 中編寫代碼&#xff0c;將輸入法設為英文模式&#xff0c;但是用 alt tab 切換到瀏覽器查看文檔&#xff0c;此時瀏覽器也是英文模式&#xff0c;但是再切回 vscode 后就變為中文模式了&#xff0c;需要使用 shift 鍵切換為英文模式&#xff0c;一次兩次還好…

【Linux加餐-網絡命令】

一、Ping命令 Ping 是一種網絡工具&#xff0c;用于測試主機之間的連通性。它通過發送 ICMP&#xff08;Internet Control Message Protocol&#xff09;回顯請求 報文到目標主機&#xff0c;并等待目標主機返回 ICMP 回顯應答 報文&#xff0c;從而判斷網絡是否通暢以及測量往…

Maven工具學習使用(六)——聚合與繼承

Maven的聚合特性能夠把項目的各個模塊聚合在一起構建,而Maven的繼承特性則能幫助抽取個模塊相同的依賴和插件等配置,在簡化POM的同時,還能促進各個模塊配置的一致性。 一般說來一個項目的子模塊都應該使用同樣的groupId,如果他們一起開發和發布,還應該使用同樣的version,…

vulhub靶場jangow-01-1.0.1

啟動靶機時點shift停在這個界面 點e進入編輯頁面&#xff0c;把ro改成rw signie init/bin/bash Ctrlx保存&#xff0c;ip a查看網卡信息 vim /etc/network/interfaces 把enp0s17改為ens33&#xff0c;保存退出 重啟靶機&#xff0c;nmap掃ip ip為192.168.93.179 nmap掃端口 掃…

C++11QT復習 (四)

Day6-1 輸入輸出流運算符重載&#xff08;2025.03.25&#xff09; 1. 拷貝構造函數的調用時機 2. 友元2.1 友元函數 3. 輸入輸出流運算符重載3.1 關鍵知識點3.2 代碼3.3 關鍵問題3.4 完整代碼 4. 下標訪問運算符 operator[]4.1 關鍵知識點4.2 代碼 5. 函數調用運算符 operator…

數倉架構告別「補丁」時代!全新批流一體 Domino 架構終結“批流縫合”

在數字化轉型的浪潮中&#xff0c;企業對數據處理的需求日益復雜多變&#xff0c;傳統的批處理和流處理架構已難以滿足日益增長的性能和時效性要求。在此背景下&#xff0c;YMatrix CEO 姚延棟發布了深度文章《數倉架構告別「補丁」時代&#xff01;全新批流一體 Domino 架構終…

一文詳解QT環境搭建:ubuntu20.4安裝配置Qt5

隨著軟件開發技術的不斷進步&#xff0c;跨平臺應用程序的需求日益增長&#xff0c;開發者們面臨著如何在不同操作系統之間保持代碼的一致性和效率的問題。Qt作為一個成熟的跨平臺C框架&#xff0c;在這方面提供了卓越的支持&#xff0c;不僅簡化了GUI應用程序的創建過程&#…

安全+低碳+高效:Acrel-3000助力企業打造未來型電能管理體系-安科瑞黃安南

一 背景 電能因為方便傳輸、易于轉換、便于控制等特性&#xff0c;成為廣大企事業單位生產、辦公最主要的能量來源。雙碳背景下&#xff0c;由于電能清潔、高效、零排放的特點&#xff0c;能源消費側將逐步以電代煤、以電代油、以電代氣&#xff0c;形成以電為中心的能源消費體…

Docker 安裝 RabbitMQ

以下是在Docker中安裝RabbitMQ并實現配置、數據、日志文件映射的完整步驟。 步驟 1&#xff1a;創建本地目錄結構 # 創建配置、數據、日志目錄 mkdir -p /root/docker/rabbitmq/{conf,data,logs}# 目錄結構說明&#xff1a; # - conf: 存放自定義配置文件 # - data: 持久化存儲…

SAP-ABAP:SAP數據集成全場景技術指南(BAPI、RFC、IDOC、BATCHJOB、ODATA、WEBSERVICE):從實時交互到批量處理

SAP數據集成全場景技術指南:從實時交互到批量處理 #mermaid-svg-hpPMerJYUerla0BJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hpPMerJYUerla0BJ .error-icon{fill:#552222;}#mermaid-svg-hpPMerJYUerla0BJ .er…

運維規則之總結(Summary of Operation and Maintenance Rules)

運維規則之總結 在運維領域&#xff0c;經驗和流程往往決定了系統的穩定性與可靠性。一個運維人&#xff0c;總結出了以下10條運維規則&#xff0c;涵蓋了從基礎管理到高級策略的全面內容&#xff0c;旨在幫助運維人員更好地應對各種挑戰&#xff0c;確保系統的平穩運行。 1.…