diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 96717a9..85c241b 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -1,7 +1,7 @@ #include "TranslateBasic.h" -AbstractExtractor::AbstractExtractor(const QString& name) - :_name_store(name), _byte_offset(0), _byte_count(0) { +AbstractExtractor::AbstractExtractor(const QString& name, DataType data) + :_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) { } bool AbstractExtractor::setOffsetFromPrevious(int bytes) @@ -21,6 +21,11 @@ QString AbstractExtractor::name() const return _name_store; } +DataType AbstractExtractor::outType() const +{ + return _type_store; +} + int AbstractExtractor::offsetFromPrevious() const { return _byte_offset; @@ -44,7 +49,7 @@ void AbstractExtractor::saveTo(QJsonObject& obj) const } BytesAsHex::BytesAsHex() - : AbstractExtractor(NAME(BytesAsHex)) { + : AbstractExtractor(NAME(BytesAsHex), DataType::ValueSequenceString) { } QVariant BytesAsHex::parse(const QByteArray& bytes) const @@ -62,7 +67,7 @@ std::shared_ptr BytesAsHex::newDefault() const } BytesAsBitCombine::BytesAsBitCombine() - : AbstractExtractor(NAME(BytesAsBitCombine)) + : AbstractExtractor(NAME(BytesAsBitCombine), DataType::TextString) { } @@ -151,7 +156,7 @@ std::shared_ptr BytesAsInteger::newDefault() const } BytesAsInteger::BytesAsInteger() - :AbstractExtractor(NAME(BytesAsInteger)) { + :AbstractExtractor(NAME(BytesAsInteger), DataType::Int64) { setCountWithinParse(8); } @@ -208,7 +213,7 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const #include BytesAsString::BytesAsString() - :AbstractExtractor(NAME(BytesAsString)) { + :AbstractExtractor(NAME(BytesAsString), DataType::TextString) { _conv_with = QTextCodec::codecForName("GBK"); } @@ -248,3 +253,42 @@ std::shared_ptr BytesAsString::newDefault() const { return std::make_shared(); } + +AbstractValueConvert::AbstractValueConvert(const QString& nm, DataType in, DataType out) + : _name_store(nm), _in_type(in), _out_type(out) { +} + +QString AbstractValueConvert::name() const +{ + return _name_store; +} + +DataType AbstractValueConvert::inType() const +{ + return _in_type; +} + +DataType AbstractValueConvert::outType() const +{ + return _out_type; +} + +void AbstractValueConvert::loadFrom(const QJsonObject& obj) +{ + auto int_in_type = (int)_in_type; + INT32_PEAK(int_in_type); + _in_type = (DataType) int_in_type; + + auto int_out_type = (int)_out_type; + INT32_PEAK(int_out_type); + _out_type = (DataType) int_out_type; +} + +void AbstractValueConvert::saveTo(QJsonObject& obj) const +{ + auto int_in_type = (int)_in_type; + INT32_SAVE(int_in_type); + + auto int_out_type = (int)_out_type; + INT32_SAVE(int_out_type); +} diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index bbcfaf9..dd0fe17 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -31,7 +31,7 @@ public: /// 内部使用的数据类型 /// enum class DataType { - ValueString, + ValueSequenceString, TextString, Int64, Flt32, @@ -51,6 +51,12 @@ public: /// virtual QString name() const = 0; + /// + /// + /// + /// + virtual DataType outType() const = 0; + /// /// 从上一个单元字节偏移字节数量 /// @@ -73,10 +79,11 @@ public: class AbstractExtractor : public ExtractUnit { private: QString _name_store; + DataType _type_store; int _byte_offset, _byte_count; public: - AbstractExtractor(const QString& name); + AbstractExtractor(const QString& name, DataType data); /// /// 设置偏移字节数量 /// @@ -90,6 +97,7 @@ public: // ExtractUnit =========================== QString name() const override; + virtual DataType outType() const; int offsetFromPrevious() const override; int countWithinParse() const override; @@ -186,3 +194,31 @@ public: 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; +}; + +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; +}; \ No newline at end of file