#pragma once #include #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; }; /// /// 内部使用的数据类型 /// enum class DataType { ValueSequenceString, TextString, Int64, // 64位整形或无符号整形 Flt32, Dbl64, }; /// /// 翻译单元抽象接口 /// class ExtractUnit : public Serializable { public: virtual ~ExtractUnit() = default; /// /// 单元名称 /// /// virtual QString name() const = 0; /// /// /// /// virtual DataType outType() const = 0; /// /// 从上一个单元字节偏移字节数量 /// /// virtual int offsetFromPrevious() const = 0; /// /// 解析所用的字节数量 /// /// virtual int countWithinParse() const = 0; /// /// 执行解析过程 /// /// /// virtual QVariant parse(const QByteArray& bytes) const = 0; }; namespace extract { class AbstractExtractor : public ExtractUnit { private: QString _name_store; DataType _type_store; int _byte_offset, _byte_count; public: AbstractExtractor(const QString& name, DataType data); /// /// 设置偏移字节数量 /// /// virtual bool setOffsetFromPrevious(int bytes); /// /// 设置解析字节数量 /// /// virtual bool setCountWithinParse(int bytes); // ExtractUnit =========================== QString name() const override; virtual DataType outType() const; 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(";"); #define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString(); #define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name; /// /// 转换源数值未16进制数值,默认分割方式 /// class BytesAsHex : public AbstractExtractor { public: BytesAsHex(); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数值为位联合 /// class BytesAsBitCombine : public AbstractExtractor { private: QHash _switch_options; public: BytesAsBitCombine(); bool setSwitchOption(int bit_index, const QString& keyword); QHash switchOptions() const; virtual void clearOptions(); // ExtractUnit ============================ 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 AbstractExtractor { private: bool unsigned_mark = false; public: BytesAsInteger(); void setUnsignedMark(bool ste); bool unsignedMark() const; // ExtractUnit ============================ 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; }; /// /// 转换源数据为字符串 /// class BytesAsString : public AbstractExtractor { private: QTextCodec* _conv_with = nullptr; public: BytesAsString(); void setStrCodec(QTextCodec* ins); QString codecName() const; // ExtractUnit ============================ 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 BytesAsFloat : public AbstractExtractor { public: BytesAsFloat(); /// /// 设置解析字节数量 /// /// virtual bool setCountWithinParse(int bytes) override; QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; class BytesAsDouble : public AbstractExtractor { public: BytesAsDouble(); /// /// 设置解析字节数量 /// /// virtual bool setCountWithinParse(int bytes) override; QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; } /// /// 数值转换抽象接口 /// class ValueConvert : public Serializable { public: virtual ~ValueConvert() = default; virtual QString name() const = 0; virtual DataType inType() const = 0; virtual DataType outType() const = 0; virtual QVariant convert(const QVariant& value) const = 0; }; namespace convert { class AbstractValueConvert : public ValueConvert { private: QString _name_store; DataType _in_type, _out_type; public: AbstractValueConvert(const QString& nm, DataType in, DataType out); QString name() const override; DataType inType() const override; DataType outType() const override; void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; class DoubleWithLSB : public AbstractValueConvert { private: double _lsb_value; public: DoubleWithLSB(); void setLSB(double lsbv); double getLSB() const; QVariant convert(const QVariant& value) const override; std::shared_ptr newDefault() const override; }; }