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