)
读取二进制文件Qt-CSDN博客hexdump -C /path/to/binary | less 看十六进制内容-CSDN博客头文件#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) // 需要按照字节对齐的外部接口报文定义!判断是否存在目录如果不存在则递归创建#include QDir bool ensureDir(const QString path) { QDir dir; if (!dir.exists(path)) { if (dir.mkpath(path)) { return true; // 创建成功 } else { return false; // 创建失败 } } return true; // 已存在 }此处把数据组包成我们期望的二进制格式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这里的组包需要注意容易出错的。注意指针的偏移位置以及涉及到的字段的长度。使用下面的类把字节流写入文件中。#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