#pragma once #include "common.h" #include /// /// 翻译单元抽象接口 /// class ExtractUnit : public Serializable { public: virtual ~ExtractUnit() = default; /// /// 单元名称 /// /// virtual QString name() const = 0; /// /// /// /// virtual DataType outType() const = 0; /// /// 设置偏移字节数量 /// /// virtual bool setOffsetSpan(int bytes) = 0; /// /// 从上一个单元字节偏移字节数量 /// /// virtual int offsetSpan() const = 0; /// /// 解析所用的字节数量 /// /// virtual int countWithin() 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 setCountWithin(int bytes); // ExtractUnit =========================== QString name() const override; virtual DataType outType() const; /// /// 设置偏移字节数量 /// /// virtual bool setOffsetSpan(int bytes); int offsetSpan() const override; int countWithin() 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 { public: BytesAsInteger(); // ExtractUnit ============================ bool setCountWithin(int bytes) override; QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== std::shared_ptr newDefault() const override; }; /// /// 转换源数据为整形 /// class BytesAsUnsigned : public AbstractExtractor { public: BytesAsUnsigned(); // ExtractUnit ============================ bool setCountWithin(int bytes) override; QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== 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(); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; class BytesAsDouble : public AbstractExtractor { public: BytesAsDouble(); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; /// /// 尺寸解析器 /// class SizeProvider { public: virtual QString name() const = 0; /// /// 获取值,如果该值无法预先计算得知,返回-1 /// /// 尺寸值 virtual int32_t value(const QString& expr) const = 0; virtual void setExpression(const QString& expr) = 0; virtual QString expression() const = 0; }; class BytesAsList : public ExtractUnit { private: std::shared_ptr _bind_unit = nullptr; int _bytes_offset = 0; std::shared_ptr _bind_size_v = nullptr; public: bool setOffsetSpan(int value); std::shared_ptr elementRule() const; bool setElementRule(std::shared_ptr u); std::shared_ptr sizeProvider() const; bool setSizeProvider(std::shared_ptr ins); public: QString name() const override; DataType outType() const override; int offsetSpan() const override; int countWithin() const override; void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; class RuleMatch { public: virtual std::shared_ptr bindRule() const = 0; virtual bool checkpass() const = 0; }; class BytesAsUnion : public AbstractExtractor { protected: std::shared_ptr _provider_ins = nullptr; public: bool setSizeProvider(std::shared_ptr ins); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; }