#pragma once #include #include #include /// /// 序列化实体 /// class Serializable { public: virtual ~Serializable() = default; /// /// 反序列化 /// /// virtual void loadFrom(const QJsonObject &obj) = 0; /// /// 序列化 /// /// virtual void saveTo(QJsonObject &obj) const = 0; /// /// 创建默认副本 /// /// virtual std::shared_ptr newDefault() const = 0; }; /// /// 翻译单元抽象接口 /// class TranslateUnit : public Serializable { public: virtual ~TranslateUnit() = default; /// /// 单元名称 /// /// virtual QString name() const = 0; /// /// 从上一个单元字节偏移字节数量 /// /// virtual int offsetFromPrevious() const = 0; /// /// 解析所用的字节数量 /// /// virtual int countWithinParse() const = 0; /// /// 执行解析过程 /// /// /// virtual QVariant parse(const QByteArray &bytes) const = 0; }; class AbstractTranslateUnit : public TranslateUnit { private: QString _name_store; int _byte_offset, _byte_count; public: AbstractTranslateUnit(const QString &name); /// /// 设置偏移字节数量 /// /// virtual bool setOffsetFromPrevious(int bytes); /// /// 设置解析字节数量 /// /// virtual bool setCountWithinParse(int bytes); // TranslateUnit =========================== QString name() const override; int offsetFromPrevious() const override; int countWithinParse() const override; // Serializable ============================== void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; #define NAME(u) #u #define INT32_SAVE(varx) obj[NAME(varx)] = varx; #define INT32_PEAK(varx) varx = obj[NAME(varx)].toInt(); #define STRLIST_SAVE(list) obj[NAME(list)] = list.join(";"); #define STRLIST_PEAK(list) list = obj[NAME(list)].toString().split(";"); /// /// 转换源数值未16进制数值,默认分割方式 /// class BytesAsHex : public AbstractTranslateUnit { public: BytesAsHex(); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; #include /// /// 转换源数值为位联合 /// class BytesAsBitCombine : public AbstractTranslateUnit { private: QHash _switch_options; public: BytesAsBitCombine(); bool setSwitchOption(int bit_index, const QString& keyword); QHash switchOptions() const; virtual void clearOptions(); // TranslateUnit ============================ QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数据为整形 /// class BytesAsInteger : public AbstractTranslateUnit { private: bool unsigned_mark = false; public: BytesAsInteger(); void setUnsignedMark(bool ste); bool unsignedMark() const; // TranslateUnit ============================ bool setCountWithinParse(int bytes) override; QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; #define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString(); #define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name; /// /// 转换源数据为字符串 /// class BytesAsString : public AbstractTranslateUnit { private: QTextCodec *_conv_with = nullptr; public: BytesAsString(); void setStrCodec(QTextCodec *ins); QString codecName() const; // TranslateUnit ============================ QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; };