写入二进制文件(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
相关推荐
尘中远3 小时前
QWT7 的科学 Colormap 色彩评估:QwtColorMapPreset 22 种预设的感知均匀性与场景化选
qt·qwt·科学绘图·科学配色
宿州派大星8 小时前
Python实战:PyQt5 + OpenCV + Dlib 打造AI桌面应用
人工智能·python·qt
长沙红胖子Qt18 小时前
Qt+TiePieHS3开发笔记(二):HS3发送器发出内置波形、直连示波器,示波器检测内置波形Demo
qt·示波器·tiepiehs3·发生器·同步发射和示波器采集
陈年老古董21 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
zhanghaha131421 小时前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
Cx330❀1 天前
Qt 界面美化指南:从零掌握 QSS 核心机制与工程实践
开发语言·qt·ui·性能优化·图形渲染
zx_741484811 天前
PyQt5 环境搭建保姆级教程:PyCharm + QtDesigner + PyUIC 完整配置
开发语言·qt·pycharm·pyqt
Python图像识别1 天前
46-【2027毕设】YOLO11田间杂草检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
沫璃染墨2 天前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss