From 0e68e0c66e62a80136c565f57e70c7d4061cd5cf Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 2 Aug 2025 10:04:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E7=81=B5=E6=B4=BB=E6=80=A7=E5=81=9A?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TranslateUI/SequenceView.cpp | 4 +- TranslateUI/SequenceView.h | 20 +--- TranslateUI/TranslateBasic.h | 22 +++- TranslateUI/common.h | 8 ++ TranslateUI/convert_basic.cpp | 4 +- TranslateUI/convert_basic.h | 2 +- TranslateUI/extract_basic.cpp | 194 ++++++++++++++++++++++------------ TranslateUI/extract_basic.h | 115 +++++++++++--------- 8 files changed, 229 insertions(+), 140 deletions(-) diff --git a/TranslateUI/SequenceView.cpp b/TranslateUI/SequenceView.cpp index 557e447..14d6b99 100644 --- a/TranslateUI/SequenceView.cpp +++ b/TranslateUI/SequenceView.cpp @@ -192,7 +192,7 @@ std::shared_ptr TranslateBasic::defaultRule() const return _default_translate_rule; } -std::shared_ptr TranslateBasic::defaultSizeProvider() const +std::shared_ptr TranslateBasic::defaultSizeProvider() const { return _default_size_provider; } @@ -202,7 +202,7 @@ QHash> TranslateBasic::extactors() const return _extractor_types; } -QHash> TranslateBasic::sizeProviders() const +QHash> TranslateBasic::sizeProviders() const { return _size_provider_types; } diff --git a/TranslateUI/SequenceView.h b/TranslateUI/SequenceView.h index db7c387..60febe4 100644 --- a/TranslateUI/SequenceView.h +++ b/TranslateUI/SequenceView.h @@ -9,24 +9,6 @@ #include "TranslateBasic.h" -/// -/// 翻译程序核心 -/// -class TranslateBasic { -private: - QHash> _extractor_types; - std::shared_ptr _default_translate_rule = nullptr; - QHash> _size_provider_types; - std::shared_ptr _default_size_provider = nullptr; - -public: - TranslateBasic(); - - std::shared_ptr defaultRule() const; - std::shared_ptr defaultSizeProvider() const; - QHash> extactors() const; - QHash> sizeProviders() const; -}; /// @@ -70,7 +52,7 @@ public: virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; -class ConstNumberProvider : public extract::SizeProvider { +class ConstNumberProvider : public SizeProvider { private: QString _number_value; diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index 87ea7f8..e5ecc9d 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -1,4 +1,24 @@ #pragma once #include "extract_basic.h" -#include "convert_basic.h" \ No newline at end of file +#include "convert_basic.h" + + +/// +/// 翻译程序核心 +/// +class TranslateBasic { +private: + QHash> _extractor_types; + std::shared_ptr _default_translate_rule = nullptr; + QHash> _size_provider_types; + std::shared_ptr _default_size_provider = nullptr; + +public: + TranslateBasic(); + + std::shared_ptr defaultRule() const; + std::shared_ptr defaultSizeProvider() const; + QHash> extactors() const; + QHash> sizeProviders() const; +}; diff --git a/TranslateUI/common.h b/TranslateUI/common.h index 95f6f73..7457be2 100644 --- a/TranslateUI/common.h +++ b/TranslateUI/common.h @@ -3,6 +3,14 @@ #include #include +#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; + /// /// 序列化实体 /// diff --git a/TranslateUI/convert_basic.cpp b/TranslateUI/convert_basic.cpp index 19e449a..8c4bd45 100644 --- a/TranslateUI/convert_basic.cpp +++ b/TranslateUI/convert_basic.cpp @@ -6,12 +6,12 @@ using namespace convert; AbstractValueConvert::AbstractValueConvert(const QString& nm, DataType in, DataType out) - : _name_store(nm), _in_type(in), _out_type(out) { + : name_store(nm), _in_type(in), _out_type(out) { } QString AbstractValueConvert::name() const { - return _name_store; + return name_store; } DataType AbstractValueConvert::inType() const diff --git a/TranslateUI/convert_basic.h b/TranslateUI/convert_basic.h index 1572969..1610870 100644 --- a/TranslateUI/convert_basic.h +++ b/TranslateUI/convert_basic.h @@ -18,7 +18,7 @@ public: namespace convert { class AbstractValueConvert : public ValueConvert { private: - QString _name_store; + QString name_store; DataType _in_type, _out_type; public: diff --git a/TranslateUI/extract_basic.cpp b/TranslateUI/extract_basic.cpp index 35e3f2e..6d0e5bd 100644 --- a/TranslateUI/extract_basic.cpp +++ b/TranslateUI/extract_basic.cpp @@ -5,55 +5,58 @@ using namespace extract; AbstractExtractor::AbstractExtractor(const QString& name, DataType data) - :_name_store(name), _type_store(data), _byte_offset(0), _byte_count(1) { +{ + _abs_data.name_store = name; + _abs_data.type_store = data; } bool AbstractExtractor::setOffsetSpan(int bytes) { - this->_byte_offset = bytes; + this->_abs_data.byte_offset = bytes; return true; } bool AbstractExtractor::setCountWithin(int bytes) { - this->_byte_count = bytes; + this->_abs_data.byte_count = bytes; return true; } QString AbstractExtractor::name() const { - return _name_store; + return _abs_data.name_store; } DataType AbstractExtractor::outType() const { - return _type_store; + return _abs_data.type_store; } int AbstractExtractor::offsetSpan() const { - return _byte_offset; + return _abs_data.byte_offset; } int AbstractExtractor::countWithin() const { - return this->_byte_count; + return this->_abs_data.byte_count; } void AbstractExtractor::loadFrom(const QJsonObject& obj) { - INT32_PEAK(_byte_offset); - INT32_PEAK(_byte_count); + INT32_PEAK(_abs_data.byte_offset); + INT32_PEAK(_abs_data.byte_count); } void AbstractExtractor::saveTo(QJsonObject& obj) const { - INT32_SAVE(_byte_offset); - INT32_SAVE(_byte_count); + INT32_SAVE(_abs_data.byte_offset); + INT32_SAVE(_abs_data.byte_count); } BytesAsHex::BytesAsHex() : AbstractExtractor(NAME(BytesAsHex), DataType::TextString) { + setCountWithin(1); } QVariant BytesAsHex::parse(const QByteArray& bytes) const @@ -79,7 +82,7 @@ BytesAsBitCombine::BytesAsBitCombine() bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword) { if (bit_index >= 0 && bit_index <= this->countWithin() * 8) { - _switch_options[bit_index] = keyword; + _combines._switch_options[bit_index] = keyword; return true; } return false; @@ -87,17 +90,17 @@ bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword) QHash BytesAsBitCombine::switchOptions() const { - return _switch_options; + return _combines._switch_options; } void BytesAsBitCombine::clearOptions() { - _switch_options.clear(); + _combines._switch_options.clear(); } QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const { - auto keys = _switch_options.keys(); + auto keys = _combines._switch_options.keys(); std::sort(keys.begin(), keys.end()); QString result; @@ -106,9 +109,9 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const auto bit_idx = idx % 8; auto char_v = bytes.at(byte_idx); if (char_v & (0x1u << bit_idx)) - result += QString("%1<%2>;").arg(_switch_options[idx], "Y"); + result += QString("%1<%2>;").arg(_combines._switch_options[idx], "Y"); else - result += QString("%1<%2>;").arg(_switch_options[idx], "N"); + result += QString("%1<%2>;").arg(_combines._switch_options[idx], "N"); } return result; } @@ -119,10 +122,10 @@ void BytesAsBitCombine::loadFrom(const QJsonObject& obj) QStringList value_list; STRLIST_PEAK(value_list); - _switch_options.clear(); + _combines._switch_options.clear(); for (auto pair : value_list) { auto items = pair.split("="); - _switch_options[items.first().toInt()] = items.last(); + _combines._switch_options[items.first().toInt()] = items.last(); } } @@ -131,8 +134,9 @@ void BytesAsBitCombine::saveTo(QJsonObject& obj) const AbstractExtractor::saveTo(obj); QStringList value_list; - for (auto key : _switch_options.keys()) { - auto pair_str = QString("%1=%2").arg(key).arg(_switch_options[key]); + for (auto key : _combines._switch_options.keys()) { + auto pair_str = QString("%1=%2").arg(key) + .arg(_combines._switch_options[key]); value_list << pair_str; } STRLIST_SAVE(value_list); @@ -168,7 +172,7 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const xbuffer.append(8 - bytes.size(), 0); } else { - xbuffer.append(8 - bytes.size(), 0xff); + xbuffer.append(8 - bytes.size(), static_cast(0xff)); } unsigned long long value = 0; @@ -185,22 +189,22 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const BytesAsString::BytesAsString() :AbstractExtractor(NAME(BytesAsString), DataType::TextString) { - _conv_with = QTextCodec::codecForName("GBK"); + _strings._conv_with = QTextCodec::codecForName("GBK"); } void BytesAsString::setStrCodec(QTextCodec* ins) { - this->_conv_with = ins; + this->_strings._conv_with = ins; } QString BytesAsString::codecName() const { - return this->_conv_with->name(); + return this->_strings._conv_with->name(); } QVariant BytesAsString::parse(const QByteArray& bytes) const { - return _conv_with->toUnicode(bytes); + return _strings._conv_with->toUnicode(bytes); } void BytesAsString::loadFrom(const QJsonObject& obj) @@ -209,7 +213,7 @@ void BytesAsString::loadFrom(const QJsonObject& obj) QString codec_name; STRING_PEAK(codec_name); - this->_conv_with = QTextCodec::codecForName(codec_name.toLatin1()); + this->_strings._conv_with = QTextCodec::codecForName(codec_name.toLatin1()); } void BytesAsString::saveTo(QJsonObject& obj) const @@ -287,47 +291,31 @@ std::shared_ptr BytesAsUnsigned::newDefault() const #include -bool BytesAsUnion::setSizeProvider(std::shared_ptr ins) -{ - this->_provider_ins = ins; - return true; -} - -QVariant BytesAsUnion::parse(const QByteArray& bytes) const -{ - throw std::logic_error("The method or operation is not implemented."); -} - -std::shared_ptr BytesAsUnion::newDefault() const -{ - throw std::logic_error("The method or operation is not implemented."); -} - bool BytesAsList::setOffsetSpan(int value) { - this->_bytes_offset = value; + this->_list._bytes_offset = value; return true; } std::shared_ptr BytesAsList::elementRule() const { - return this->_bind_unit; + return this->_list._bind_unit; } bool BytesAsList::setElementRule(std::shared_ptr u) { - this->_bind_unit = u; + this->_list._bind_unit = u; return true; } -std::shared_ptr BytesAsList::sizeProvider() const +std::shared_ptr BytesAsList::sizeProvider() const { - return this->_bind_size_v; + return this->_list._bind_size_v; } bool BytesAsList::setSizeProvider(std::shared_ptr ins) { - this->_bind_size_v = ins; + this->_list._bind_size_v = ins; return true; } @@ -343,43 +331,44 @@ DataType BytesAsList::outType() const int BytesAsList::offsetSpan() const { - return _bytes_offset; + return _list._bytes_offset; } int BytesAsList::countWithin() const { - auto expr = this->_bind_size_v->expression(); - if (this->_bind_size_v->value(expr) < 0) { + auto expr = this->_list._bind_size_v->expression(); + if (this->_list._bind_size_v->value(expr) < 0) { return 0; } - return this->_bind_size_v->value(expr) * this->_bind_unit->countWithin(); + return this->_list._bind_size_v->value(expr) + * this->_list._bind_unit->countWithin(); } void BytesAsList::loadFrom(const QJsonObject& obj) { - INT32_PEAK(_bytes_offset); + INT32_PEAK(_list._bytes_offset); QString bind_provider_expr = ""; STRING_SAVE(bind_provider_expr); - if (this->_bind_size_v) - this->_bind_size_v->setExpression(bind_provider_expr); + if (this->_list._bind_size_v) + this->_list._bind_size_v->setExpression(bind_provider_expr); } void BytesAsList::saveTo(QJsonObject& obj) const { QString bind_unit_name = ""; - if (this->_bind_unit) - bind_unit_name = this->_bind_unit->name(); + if (this->_list._bind_unit) + bind_unit_name = this->_list._bind_unit->name(); STRING_SAVE(bind_unit_name); - INT32_SAVE(_bytes_offset); + INT32_SAVE(_list._bytes_offset); QString bind_size_provider_name = ""; QString bind_provider_expr = ""; - if (this->_bind_size_v) { - bind_provider_expr = this->_bind_size_v->expression(); - bind_size_provider_name = this->_bind_size_v->name(); + if (this->_list._bind_size_v) { + bind_provider_expr = this->_list._bind_size_v->expression(); + bind_size_provider_name = this->_list._bind_size_v->name(); } STRING_SAVE(bind_size_provider_name); STRING_SAVE(bind_provider_expr); @@ -389,13 +378,13 @@ QVariant BytesAsList::parse(const QByteArray& bytes) const { QVariantList value_list; - auto expr = this->_bind_size_v->expression(); - auto size_value = this->_bind_size_v->value(expr); - auto unit_size = this->_bind_unit->countWithin(); + auto expr = this->_list._bind_size_v->expression(); + auto size_value = this->_list._bind_size_v->value(expr); + auto unit_size = this->_list._bind_unit->countWithin(); for (auto idx = 0; idx < size_value; ++idx) { auto secn = bytes.mid(unit_size * idx, unit_size); - auto value_v = this->_bind_unit->parse(secn); + auto value_v = this->_list._bind_unit->parse(secn); value_list << value_v; } @@ -406,3 +395,76 @@ std::shared_ptr BytesAsList::newDefault() const { return std::make_shared(); } + +QString BytesAsUnion::name() const +{ + return NAME(BytesAsUnion); +} + +DataType BytesAsUnion::outType() const +{ + return DataType::UNION_COMBINATE; +} + +int BytesAsUnion::offsetSpan() const +{ + return _union.byte_offset; +} + +int BytesAsUnion::countWithin() const +{ + return _union.byte_count; +} + +QVariant BytesAsUnion::parse(const QByteArray& bytes) const +{ + for (auto u : this->elementRules()) + if (u->checkpass(bytes)) + return u->bindRule()->parse(bytes); + + return QVariant(); +} + +void BytesAsUnion::loadFrom(const QJsonObject& obj) +{ + throw std::logic_error("The method or operation is not implemented."); +} + +void BytesAsUnion::saveTo(QJsonObject& obj) const +{ + INT32_SAVE(_union.byte_count); + INT32_SAVE(_union.byte_offset); +} + +std::shared_ptr BytesAsUnion::newDefault() const +{ + return std::make_shared(); +} + +QList> BytesAsUnion::elementRules() const +{ + return _union._rule_list; +} + +bool BytesAsUnion::setElementRule(std::shared_ptr u) +{ + this->_union._rule_list << u; + return true; +} + +void BytesAsUnion::clearRules() +{ + this->_union._rule_list.clear(); +} + +bool BytesAsUnion::setCountWithin(int bytes) +{ + this->_union.byte_count = bytes; + return true; +} + +bool BytesAsUnion::setOffsetSpan(int value) +{ + this->_union.byte_offset = value; + return true; +} diff --git a/TranslateUI/extract_basic.h b/TranslateUI/extract_basic.h index 3554415..f9f7e97 100644 --- a/TranslateUI/extract_basic.h +++ b/TranslateUI/extract_basic.h @@ -3,7 +3,6 @@ #include "common.h" #include - /// /// 翻译单元抽象接口 /// @@ -46,14 +45,42 @@ public: 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 { - private: - QString _name_store; - DataType _type_store; - int _byte_offset, _byte_count; - 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); @@ -73,14 +100,6 @@ namespace extract { 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进制数值,默认分割方式 /// @@ -96,10 +115,11 @@ namespace extract { /// 转换源数值为位联合 /// class BytesAsBitCombine : public AbstractExtractor { - private: - QHash _switch_options; - public: + struct __Private { + QHash _switch_options; + } _combines; + BytesAsBitCombine(); bool setSwitchOption(int bit_index, const QString& keyword); @@ -129,6 +149,7 @@ namespace extract { // Serializable ============================== std::shared_ptr newDefault() const override; }; + /// /// 转换源数据为整形 /// @@ -148,8 +169,10 @@ namespace extract { /// 转换源数据为字符串 /// class BytesAsString : public AbstractExtractor { - private: - QTextCodec* _conv_with = nullptr; + public: + struct __Private { + QTextCodec* _conv_with = nullptr; + } _strings; public: BytesAsString(); @@ -182,28 +205,14 @@ namespace extract { 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: + 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); @@ -213,7 +222,6 @@ namespace extract { bool setSizeProvider(std::shared_ptr ins); public: - QString name() const override; DataType outType() const override; int offsetSpan() const override; @@ -227,22 +235,31 @@ namespace extract { }; - class RuleMatch { + class BytesAsUnion : public ExtractUnit { public: - virtual std::shared_ptr bindRule() const = 0; - virtual bool checkpass() const = 0; - }; - class BytesAsUnion : public AbstractExtractor { - protected: - std::shared_ptr _provider_ins = nullptr; + struct __Private { + int byte_offset, byte_count; + QList> _rule_list; + } _union; public: - bool setSizeProvider(std::shared_ptr ins); + bool setCountWithin(int bytes); + void clearRules(); + QList> elementRules() const; + bool setElementRule(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(const QJsonObject& obj) override; - + void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; };