写入二进制文件(Qt)

读取二进制文件(Qt)-CSDN博客

hexdump -C /path/to/binary | less 看十六进制内容-CSDN博客

头文件:

cpp 复制代码
#include <QtGlobal>
#include <QDateTime>

#pragma pack (push ,1)	// 需要按照字节对齐的外部接口报文定义!
// 文件头结构
struct RecordMsgHeader
{
//    quint32 header;
//    quint32 length;
    unsigned char flag;
    unsigned short length;
    unsigned short sendAddr;
    unsigned short recvAddr;
    unsigned char msgType;
};

// 记录报文结构
struct RecordMsg
{
    RecordMsgHeader  header;
    quint64 frameId;
    quint64 time;
    QDateTime localTime;
    QDateTime centerTime;
    QByteArray data;
};

#pragma pack (pop)	// 需要按照字节对齐的外部接口报文定义!

判断是否存在目录,如果不存在,则递归创建

cpp 复制代码
#include <QDir>

bool ensureDir(const QString &path)
{
    QDir dir;
    if (!dir.exists(path)) {
        if (dir.mkpath(path)) {
            return true;   // 创建成功
        } else {
            return false;  // 创建失败
        }
    }
    return true;           // 已存在
}

此处:把数据组包成我们期望的二进制格式

cpp 复制代码
void recordMsgManager::add(QByteArray & msg)
{
    if(msg.size() < sizeof(sysBDPHead))
    {
        return;
    }
    sysBDPHead * head = (sysBDPHead *)msg.data();
    RecordMsg recordMsg;
    {
        RecordMsgHeader & header = recordMsg.header;
        header.flag = 0x3C;
        header.length = msg.count() + sizeof(RecordMsg) - sizeof(QByteArray);
        header.sendAddr = head->m_SAddr;
        header.recvAddr = head->m_RAddr;
        header.msgType = 0x01;
    }

    recordMsg.frameId = mFrameId;
    //recordMsg.data = msg;
    qDebug() << __FILE__ << __LINE__ << msg.toHex();
    recordMsg.time = QDateTime::currentSecsSinceEpoch();
    //recordMsg.localTime = m_localTime;
    recordMsg.centerTime = QDateTime::currentDateTime();

    mFrameId++;
    const char * ptr = (const char *)&recordMsg;
    int offset = sizeof(RecordMsg) - sizeof(QByteArray);
    mDataLogger.append(ptr,offset);
    ptr += offset;
    mDataLogger.append(msg.data(),msg.count());
}

ps:这里的组包需要注意,容易出错的。注意指针的偏移位置,以及涉及到的字段的长度。

使用下面的类,把字节流写入文件中。

cpp 复制代码
#ifndef DATALOGGER_H
#define DATALOGGER_H
#include <QFile>

class DataLogger
{
public:
    bool open(const QString &path) {
        m_file.setFileName(path);
        return m_file.open(QIODevice::WriteOnly | QIODevice::Append);
    }

    void append(const QByteArray &data) {
        if (!m_file.isOpen())
            return;
        qint64 n = m_file.write(data);
        if (n != data.size()) {
            // 处理写入不完整
        }
    }
    void append(const char *data, qint64 len) {
        if (!m_file.isOpen())
            return;
        qint64 n = m_file.write(data,len);
        if (n != len) {
            // 处理写入不完整
        }
    }
    void close() {
        if (m_file.isOpen())
            m_file.close();
    }

private:
    QFile m_file;
};

#endif // DATALOGGER_H
相关推荐
小鱼仙官9 小时前
Qt 主界面弹出分界面
开发语言·qt
誰能久伴不乏13 小时前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
Bczheng117 小时前
VS2022 安装MFC和QT
c++·qt·mfc
会编程的小孩18 小时前
8.19号函数
qt
蓝祁子yoky2 天前
Qt学习日记 Day15:网络编程(二)- UDP基础
网络·qt·学习
读书札记20222 天前
Qt UTF-8和UTF-8(BOM)
开发语言·qt
ShineWinsu2 天前
对于Qt:QProgressBar常见属性的解析
开发语言·c++·qt·进度条·gui·定时器·qprogressbar
ShineWinsu2 天前
对于Qt:QLCDNumber常见属性以及QTimer的解析
服务器·数据库·c++·qt·gui·qtimer·qlcdnumber
听风吹等浪起2 天前
第26章:ViT+InceptionDW+FocalLoss改进|CT骨折影像二分类完整Pytorch实现(含PyQt5推理GUI)
pytorch·qt·分类
ShineWinsu2 天前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup