#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; }; /// /// 尺寸解析器 /// 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 RuleMatch { public: virtual QString name() const = 0; virtual std::shared_ptr bindRule() const = 0; virtual bool checkpass(const QByteArray& buffer) const = 0; }; namespace extract { class AbstractExtractor : public ExtractUnit { public: struct __Private { QString name_store = ""; DataType type_store = DataType::Integer; int byte_offset = 0, byte_count = 1; } _abs_data; 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(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 转换源数值未16进制数值,默认分割方式 /// class BytesAsHex : public AbstractExtractor { public: BytesAsHex(); QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; /// /// 转换源数值为位联合 /// class BytesAsBitCombine : public AbstractExtractor { public: struct __Private { QHash _switch_options; } _combine; 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(std::shared_ptr core, 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 { public: struct __Private { QTextCodec* _conv_with = nullptr; } _strings; public: BytesAsString(); void setStrCodec(QTextCodec* ins); QString codecName() const; // ExtractUnit ============================ QVariant parse(const QByteArray& bytes) const override; // Serializable ============================== void loadFrom(std::shared_ptr core, 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 BytesAsList : public ExtractUnit { public: struct __Private { std::shared_ptr _bind_unit = nullptr; int _bytes_offset = 0; std::shared_ptr _bind_size_v = nullptr; } _list; public: bool setOffsetSpan(int value); std::shared_ptr elementRule() const; bool appendElementRule(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(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; QVariant parse(const QByteArray& bytes) const override; std::shared_ptr newDefault() const override; }; class BytesAsUnion : public ExtractUnit { public: struct __Private { int byte_offset = 0, byte_count = 1; QList> _rule_list; } _union; public: bool setCountWithin(int bytes); void clearRules(); QList> elementRules() const; bool appendElementRule(std::shared_ptr u); public: QString name() const override; DataType outType() const override; bool setOffsetSpan(int value); int offsetSpan() const override; int countWithin() const override; QVariant parse(const QByteArray& bytes) const override; void loadFrom(std::shared_ptr core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; }