Files
2026-10-19 17:48:03 +08:00

79 lines
1.6 KiB
C++

#ifndef MESSAGE_H
#define MESSAGE_H
// 协议类:用于接收外部 网络通信 发送的打印内容
#include <QObject>
#include <QByteArray>
/*
| 起始标识(1B) | 预留字段(1B) | 内容长度(2B) | 数据内容(NB) | 结束标识(1B) |
| 0x2B | 自定义 | N() | 实际数据 | 0x3C |
2B 00 02 00 08 08 3C
*/
// 内存对齐
#pragma pack(push, 1)
struct MsgHead {
char start;
char reserved;
unsigned short length;
MsgHead() {
start = 0x2B;
reserved = 0;
length = 0;
}
bool isValid() {
return start == 0x2B;
}
};
struct MsgTail {
quint8 end;
MsgTail() {
end = 0x3C;
}
bool isValid() {
return end == 0x3C;
}
};
#pragma pack(pop)
class Message : public QObject
{
Q_OBJECT
public:
Message(QObject *parent = 0);
~Message();
// 打包:数据 + 预留字段 -> 完整帧
QByteArray pack(const QByteArray &data);
// 解包:完整帧 -> 数据和预留字段
bool unpack(const QByteArray &frame, QByteArray &data);
// 验证帧格式
bool validate(const QByteArray &frame);
QByteArray extractFrame(const QByteArray &buffer, int &consumedBytes);
private:
// 协议常量
char FRAME_START ; // '+' 0x2b
char FRAME_END; // '<' 0x3c
int HEADER_SIZE ; // 1(起始) + 2(长度) + 1(预留)
int TRAILER_SIZE; // 1(结束)
int MIN_FRAME_SIZE; // 5字节
quint16 readLength(const QByteArray &frame);
bool checkFrameBoundary(const QByteArray &frame);
};
#endif // MESSAGE_H