#ifndef MESSAGE_H #define MESSAGE_H // 协议类:用于接收外部 网络通信 发送的打印内容 #include #include /* | 起始标识(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