最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt 二進制數(shù)據(jù)讀寫詳解

 更新時間:2026年01月05日 09:15:27   作者:小灰灰搞電子  
本文詳細介紹了Qt中二進制數(shù)據(jù)讀寫的核心概念和操作方法,主要是QByteArray、QFile、QDataStream和QBuffer的功能及用途,具有一定的參考價值,感興趣的可以了解一下

一、Qt 二進制數(shù)據(jù)讀寫講解

1、核心概念

  1. QByteArray:這是 Qt 中處理原始字節(jié)數(shù)據(jù)的核心容器類。它可以存儲任意字節(jié)序列(char* 數(shù)據(jù))。
  2. QFile:用于訪問文件系統(tǒng)中的文件。它可以以文本模式或二進制模式打開文件。
  3. QDataStream:提供了一種序列化的方式,將基本數(shù)據(jù)類型(如 int, float, QString 等)和更復雜的結構轉換成字節(jié)流,以便寫入文件或網絡套接字,并能從字節(jié)流中還原出來。它負責處理字節(jié)序(Endianness)等問題。
  4. QBuffer:將 QByteArray 當作一個 QIODevice(類似于文件或套接字)來使用,方便進行流式操作。

2、二進制寫入操作

2.1、方法一:直接使用QFile和QByteArray

#include <QFile>
#include <QByteArray>

// 準備要寫入的二進制數(shù)據(jù)
QByteArray data;
data.append(0x01); // 寫入一個字節(jié) 0x01
data.append(0x02); // 寫入一個字節(jié) 0x02
// ... 可以填充任意字節(jié)

// 打開文件 (使用 QIODevice::WriteOnly 和 QIODevice::Truncate 確保清空原有內容)
QFile file("binary.dat");
if (file.open(QIODevice::WriteOnly)) {
    // 將整個 QByteArray 寫入文件
    qint64 bytesWritten = file.write(data);
    if (bytesWritten == -1) {
        // 處理寫入錯誤
    }
    file.close(); // 關閉文件
} else {
    // 處理文件打開失敗
}

2.2、方法二:使用QDataStream進行序列化(推薦)

#include <QFile>
#include <QDataStream>

QFile file("structured.dat");
if (file.open(QIODevice::WriteOnly)) {
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_6_5); // 設置序列化版本,保證兼容性

    // 寫入各種類型的數(shù)據(jù)
    quint8 byteValue = 0xAB;
    qint32 intValue = 123456;
    float floatValue = 3.14159f;
    QString stringValue = "Hello Binary";

    out << byteValue; // 寫入一個字節(jié) (quint8)
    out << intValue;  // 寫入一個 32 位整數(shù)
    out << floatValue; // 寫入一個浮點數(shù)
    out << stringValue; // 寫入一個字符串 (Qt 會處理其內部編碼和長度)

    file.close();
} else {
    // 處理錯誤
}

QDataStream 會自動處理不同平臺上可能存在的字節(jié)序問題(大端序 Big-Endian 或小端序 Little-Endian)。默認情況下,它使用大端序。你也可以使用 out.setByteOrder(QDataStream::LittleEndian) 顯式設置。

3、二進制讀取操作

3.1、方法一:直接使用QFile和QByteArray

#include <QFile>
#include <QByteArray>

QFile file("binary.dat");
if (file.open(QIODevice::ReadOnly)) {
    // 一次性讀取整個文件內容到 QByteArray
    QByteArray allData = file.readAll();
    file.close();

    // 處理 allData
    if (allData.size() >= 2) {
        quint8 firstByte = static_cast<quint8>(allData.at(0)); // 讀取第一個字節(jié)
        quint8 secondByte = static_cast<quint8>(allData.at(1)); // 讀取第二個字節(jié)
        // ... 根據(jù)協(xié)議解析后續(xù)字節(jié)
    }
} else {
    // 處理錯誤
}

3.2、方法二:使用QDataStream進行反序列化(推薦)

#include <QFile>
#include <QDataStream>

QFile file("structured.dat");
if (file.open(QIODevice::ReadOnly)) {
    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_6_5); // 必須與寫入時使用的版本一致!

    // 按寫入順序讀取數(shù)據(jù)
    quint8 byteValue;
    qint32 intValue;
    float floatValue;
    QString stringValue;

    in >> byteValue;   // 讀取一個字節(jié)
    in >> intValue;    // 讀取一個 32 位整數(shù)
    in >> floatValue;  // 讀取浮點數(shù)
    in >> stringValue; // 讀取字符串

    file.close();

    // 現(xiàn)在可以使用讀取到的數(shù)據(jù) byteValue, intValue, floatValue, stringValue
} else {
    // 處理錯誤
}

使用 QDataStream 讀取時,順序和類型必須與寫入時完全一致,否則會導致數(shù)據(jù)錯亂或讀取失敗。QDataStream 會維護一個狀態(tài),你可以通過 in.status() 檢查是否有錯誤發(fā)生。

4、使用QBuffer進行內存讀寫

#include <QBuffer>
#include <QDataStream>

QByteArray bufferData; // 最終數(shù)據(jù)將存儲在這里
QBuffer buffer(&bufferData);
buffer.open(QIODevice::WriteOnly); // 打開 Buffer 用于寫入

QDataStream out(&buffer);
out << QString("Data in Memory") << 42;
buffer.close(); // 此時 bufferData 包含了序列化后的數(shù)據(jù)

// 從 bufferData 讀取
buffer.setBuffer(&bufferData); // 關聯(lián)同一個 QByteArray
buffer.open(QIODevice::ReadOnly); // 打開 Buffer 用于讀取

QDataStream in(&buffer);
QString str;
int num;
in >> str >> num;

buffer.close();

5、注意事項

  1. 字節(jié)序:如果數(shù)據(jù)需要在不同架構(x86, ARM 等)或不同系統(tǒng)(Windows, Linux, macOS)間交換,務必使用 QDataStream 并統(tǒng)一設置字節(jié)序(通常用默認的大端序或顯式設置)。
  2. 版本控制QDataStream 的序列化格式在不同 Qt 版本間可能有微小變化。使用 setVersion 指定一致的版本號(如 Qt_6_5)可以保證長期存儲或跨版本程序的數(shù)據(jù)兼容性。
  3. 錯誤處理:始終檢查文件是否成功打開、讀寫操作是否成功(write 返回寫入字節(jié)數(shù),QDataStream::status())。
  4. 類型匹配:讀取時使用的類型必須與寫入時完全匹配(例如,寫入 qint32 就必須讀取 qint32,不能是 int,除非你確定平臺上的 int 就是 32 位)。
  5. 性能:對于大文件,考慮分塊讀取寫入,避免一次性 readAll() 消耗過多內存。
  6. 安全性:讀取外部二進制文件時要注意潛在的安全風險(如緩沖區(qū)溢出)。

6、示例:一個簡單的十六進制查看器片段

#include <QFile>
#include <QDebug>

void viewHex(const QString &filename) {
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Failed to open file";
        return;
    }

    QByteArray data = file.read(16); // 每次讀取 16 字節(jié)
    while (!data.isEmpty()) {
        qDebug().noquote() << data.toHex(' ').toUpper(); // 轉換為十六進制字符串,空格分隔,大寫
        data = file.read(16);
    }

    file.close();
}

二、示例

1、源碼

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QDataStream>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_write_clicked()
{
    // 二進制數(shù)據(jù)寫入
    qDebug()<<"開始寫入!";
    QFile writeFile("data.bin");
    if (!writeFile.open(QIODevice::WriteOnly)) {
        qDebug() << "文件打開失敗";
        return ;
    }

    QDataStream outStream(&writeFile);
    outStream.setVersion(QDataStream::Qt_6_0); // 設置數(shù)據(jù)流版本

    int intValue = 42;
    double doubleValue = 3.14159;
    QString stringValue = "Qt二進制示例";

    // 寫入不同類型數(shù)據(jù)
    outStream << intValue << doubleValue << stringValue;
    writeFile.close();

    qDebug()<<"寫入成功!";
}


void MainWindow::on_read_clicked()
{
    // 二進制數(shù)據(jù)讀取
    qDebug()<<"開始讀??!";
    QFile readFile("data.bin");
    if (!readFile.open(QIODevice::ReadOnly)) {
        qDebug() << "文件打開失敗";
        return;
    }
    QDataStream inStream(&readFile);
    inStream.setVersion(QDataStream::Qt_6_0);

    int readInt;
    double readDouble;
    QString readString;

    // 按寫入順序讀取數(shù)據(jù)
    inStream >> readInt >> readDouble >> readString;
    readFile.close();
    qDebug()<<"讀取成功!";
    // 驗證讀取結果
    qDebug() << "讀取整數(shù):" << readInt;
    qDebug() << "讀取浮點數(shù):" << readDouble;
    qDebug() << "讀取字符串:" << readString;
}


代碼說明:

  1. 二進制寫入

    • 使用 QFileQIODevice::WriteOnly 模式創(chuàng)建文件
    • QDataStream 提供序列化接口
    • 通過 << 操作符寫入多種數(shù)據(jù)類型
  2. 二進制讀取

    • QIODevice::ReadOnly 模式打開文件
    • 使用相同的 QDataStream 版本
    • 通過 >> 操作符按寫入順序讀取數(shù)據(jù)
  3. 注意事項

    • 數(shù)據(jù)流版本需保持一致(Qt_6_0 可替換為實際版本)
    • 讀取順序必須與寫入順序嚴格一致
    • 支持所有Qt基本類型和容器類(如 QList, QMap
  4. 數(shù)據(jù)類型支持

    • 基本類型:int, float, double, bool
    • Qt類型:QString, QByteArray, QDateTime
    • 自定義類型(需實現(xiàn)序列化操作符)

2、運行效果

到此這篇關于Qt 二進制數(shù)據(jù)讀寫詳解的文章就介紹到這了,更多相關Qt 二進制數(shù)據(jù)讀寫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • QT調用vs2019生成的c++動態(tài)庫的方法實現(xiàn)

    QT調用vs2019生成的c++動態(tài)庫的方法實現(xiàn)

    本文主要介紹了QT調用vs2019生成的c++動態(tài)庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • C語言一看就懂的指針與結構體介紹

    C語言一看就懂的指針與結構體介紹

    指針提供了對地址操作的一種方法,因此,使用指針可使得C語言能夠更高效地實現(xiàn)對計算機底層硬件的操作。另外,通過指針可以更便捷地操作數(shù)組。C數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結構是C編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲不同類型的數(shù)據(jù)項
    2022-04-04
  • c語言多進程tcp服務器示例

    c語言多進程tcp服務器示例

    這篇文章主要介紹了c語言多進程tcp服務器示例,多進程socket,epoll實現(xiàn)IO復用,需要的朋友可以參考下
    2014-03-03
  • C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和

    這篇文章主要介紹了C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++ 實現(xiàn)PE文件特征碼識別的步驟

    C++ 實現(xiàn)PE文件特征碼識別的步驟

    PE文件就是我們常說的EXE可執(zhí)行文件,針對文件特征的識別可以清晰的知道該程序是使用何種編程語言實現(xiàn)的,前提是要有特征庫,PE特征識別有多種形式,第一種是靜態(tài)識別,第二種則是動態(tài)識別,我們經常使用的PEID查殼工具是基于靜態(tài)檢測的方法。
    2021-06-06
  • C++之類和對象課后習題簡單實例

    C++之類和對象課后習題簡單實例

    下面小編就為大家?guī)硪黄狢++之類和對象課后習題簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • C++ BloomFilter布隆過濾器應用及概念詳解

    C++ BloomFilter布隆過濾器應用及概念詳解

    布隆過濾器是由布?。˙urton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結構,特點是高效地插入和查詢,可以用來告訴你 “某樣東西一定不存在或者可能存在”,它是用多個哈希函數(shù),將一個數(shù)據(jù)映射到位圖結構中
    2023-03-03
  • C語言手寫多級時間輪定時器

    C語言手寫多級時間輪定時器

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)手寫多級時間輪定時器,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-09-09
  • Qt實現(xiàn)定時器的兩種方法分享

    Qt實現(xiàn)定時器的兩種方法分享

    這篇文章主要為大家詳細介紹了Qt中實現(xiàn)定時器的兩種不同方法,文中的示例代碼講解詳細,對我們了解Qt有一定的幫助,感興趣的可以跟隨小編一起學習一下
    2022-11-11
  • C++實現(xiàn)連連看游戲

    C++實現(xiàn)連連看游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)連連看游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

镇安县| 拜城县| 平阳县| 科技| 壶关县| 焦作市| 海林市| 微博| 鄱阳县| 罗源县| 威宁| 惠州市| 台南县| 利辛县| 宁南县| 新竹市| 台东市| 孟村| 夏邑县| 大姚县| 双鸭山市| 麟游县| 延庆县| 通辽市| 新绛县| 营口市| 汶川县| 唐河县| 包头市| 岳池县| 新沂市| 白朗县| 新乡市| 江源县| 理塘县| 鄂托克前旗| 于都县| 天祝| 禹城市| 循化| 牙克石市|