为集成化序列化和反序列话构建

This commit is contained in:
codeboss 2025-08-02 10:42:39 +08:00
parent 0e68e0c66e
commit 33cb4a12b5
9 changed files with 139 additions and 124 deletions

View File

@ -66,7 +66,7 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx)
if (typeid(*new_inst.get()) == typeid(BytesAsList)) { if (typeid(*new_inst.get()) == typeid(BytesAsList)) {
auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst); auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst);
if (!conv->elementRule()) { if (!conv->elementRule()) {
conv->setElementRule(this->base->defaultRule()); conv->appendElementRule(this->base->defaultRule());
} }
if (!conv->sizeProvider()) { if (!conv->sizeProvider()) {
@ -153,59 +153,6 @@ void SequenceRulesView::removeTranslateUnit()
_sequence_model->removeRow(idx_curr.row()); _sequence_model->removeRow(idx_curr.row());
} }
TranslateBasic::TranslateBasic()
{
// extractor type-list
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsInteger>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsUnsigned>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsString>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsHex>();
_extractor_types[u_ptr->name()] = u_ptr;
this->_default_translate_rule = u_ptr;
u_ptr = std::make_shared<BytesAsFloat>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsDouble>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsList>();
_extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr;
_size_provider_types[sz_ptr->name()] = sz_ptr;
}
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
{
return _default_translate_rule;
}
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
{
return _default_size_provider;
}
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
{
return _extractor_types;
}
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
{
return _size_provider_types;
}
RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins) RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins)
:_kernel(ins) { :_kernel(ins) {
@ -239,23 +186,3 @@ void RuleSelectDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptio
{ {
editor->setGeometry(option.rect); editor->setGeometry(option.rect);
} }
QString ConstNumberProvider::name() const
{
return NAME(ConstNumberProvider);
}
int32_t ConstNumberProvider::value(const QString& expr) const
{
return expr.toInt();
}
void ConstNumberProvider::setExpression(const QString& expr)
{
this->_number_value = expr;
}
QString ConstNumberProvider::expression() const
{
return this->_number_value;
}

View File

@ -52,18 +52,6 @@ public:
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
}; };
class ConstNumberProvider : public SizeProvider {
private:
QString _number_value;
public:
QString name() const override;
int32_t value(const QString& expr) const override;
void setExpression(const QString &expr) override;
QString expression() const override;
};
/// <summary> /// <summary>
/// ÐòÁл¯¹æÔòÊÓͼ /// ÐòÁл¯¹æÔòÊÓͼ
/// </summary> /// </summary>

View File

@ -1 +1,78 @@
#include "TranslateBasic.h" #include "TranslateBasic.h"
using namespace extract;
TranslateBasic::TranslateBasic()
{
// extractor type-list
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsInteger>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsUnsigned>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsString>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsHex>();
_extractor_types[u_ptr->name()] = u_ptr;
this->_default_translate_rule = u_ptr;
u_ptr = std::make_shared<BytesAsFloat>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsDouble>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsList>();
_extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr;
_size_provider_types[sz_ptr->name()] = sz_ptr;
}
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
{
return _default_translate_rule;
}
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
{
return _default_size_provider;
}
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
{
return _extractor_types;
}
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
{
return _size_provider_types;
}
QString ConstNumberProvider::name() const
{
return NAME(ConstNumberProvider);
}
int32_t ConstNumberProvider::value(const QString& expr) const
{
return expr.toInt();
}
void ConstNumberProvider::setExpression(const QString& expr)
{
this->_number_value = expr;
}
QString ConstNumberProvider::expression() const
{
return this->_number_value;
}

View File

@ -22,3 +22,15 @@ public:
QHash<QString, std::shared_ptr<ExtractUnit>> extactors() const; QHash<QString, std::shared_ptr<ExtractUnit>> extactors() const;
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviders() const; QHash<QString, std::shared_ptr<SizeProvider>> sizeProviders() const;
}; };
class ConstNumberProvider : public SizeProvider {
private:
QString _number_value;
public:
QString name() const override;
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const override;
};

View File

@ -11,6 +11,7 @@
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString(); #define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name; #define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
class TranslateBasic;
/// <summary> /// <summary>
/// 序列化实体 /// 序列化实体
/// </summary> /// </summary>
@ -21,7 +22,7 @@ public:
/// 反序列化 /// 反序列化
/// </summary> /// </summary>
/// <param name="obj"></param> /// <param name="obj"></param>
virtual void loadFrom(const QJsonObject& obj) = 0; virtual void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) = 0;
/// <summary> /// <summary>
/// 序列化 /// 序列化
/// </summary> /// </summary>

View File

@ -24,7 +24,7 @@ DataType AbstractValueConvert::outType() const
return _out_type; return _out_type;
} }
void AbstractValueConvert::loadFrom(const QJsonObject& obj) void AbstractValueConvert::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
auto int_in_type = (int)_in_type; auto int_in_type = (int)_in_type;
INT32_PEAK(int_in_type); INT32_PEAK(int_in_type);

View File

@ -28,7 +28,7 @@ namespace convert {
DataType inType() const override; DataType inType() const override;
DataType outType() const override; DataType outType() const override;
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
}; };

View File

@ -42,7 +42,8 @@ int AbstractExtractor::countWithin() const
return this->_abs_data.byte_count; return this->_abs_data.byte_count;
} }
void AbstractExtractor::loadFrom(const QJsonObject& obj) void AbstractExtractor::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
INT32_PEAK(_abs_data.byte_offset); INT32_PEAK(_abs_data.byte_offset);
INT32_PEAK(_abs_data.byte_count); INT32_PEAK(_abs_data.byte_count);
@ -82,7 +83,7 @@ BytesAsBitCombine::BytesAsBitCombine()
bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword) bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
{ {
if (bit_index >= 0 && bit_index <= this->countWithin() * 8) { if (bit_index >= 0 && bit_index <= this->countWithin() * 8) {
_combines._switch_options[bit_index] = keyword; _combine._switch_options[bit_index] = keyword;
return true; return true;
} }
return false; return false;
@ -90,17 +91,17 @@ bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
QHash<int, QString> BytesAsBitCombine::switchOptions() const QHash<int, QString> BytesAsBitCombine::switchOptions() const
{ {
return _combines._switch_options; return _combine._switch_options;
} }
void BytesAsBitCombine::clearOptions() void BytesAsBitCombine::clearOptions()
{ {
_combines._switch_options.clear(); _combine._switch_options.clear();
} }
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
{ {
auto keys = _combines._switch_options.keys(); auto keys = _combine._switch_options.keys();
std::sort(keys.begin(), keys.end()); std::sort(keys.begin(), keys.end());
QString result; QString result;
@ -109,23 +110,24 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
auto bit_idx = idx % 8; auto bit_idx = idx % 8;
auto char_v = bytes.at(byte_idx); auto char_v = bytes.at(byte_idx);
if (char_v & (0x1u << bit_idx)) if (char_v & (0x1u << bit_idx))
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "Y"); result += QString("%1<%2>;").arg(_combine._switch_options[idx], "Y");
else else
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "N"); result += QString("%1<%2>;").arg(_combine._switch_options[idx], "N");
} }
return result; return result;
} }
void BytesAsBitCombine::loadFrom(const QJsonObject& obj) void BytesAsBitCombine::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
AbstractExtractor::loadFrom(obj); AbstractExtractor::loadFrom(core, obj);
QStringList value_list; QStringList value_list;
STRLIST_PEAK(value_list); STRLIST_PEAK(value_list);
_combines._switch_options.clear(); _combine._switch_options.clear();
for (auto pair : value_list) { for (auto pair : value_list) {
auto items = pair.split("="); auto items = pair.split("=");
_combines._switch_options[items.first().toInt()] = items.last(); _combine._switch_options[items.first().toInt()] = items.last();
} }
} }
@ -134,9 +136,9 @@ void BytesAsBitCombine::saveTo(QJsonObject& obj) const
AbstractExtractor::saveTo(obj); AbstractExtractor::saveTo(obj);
QStringList value_list; QStringList value_list;
for (auto key : _combines._switch_options.keys()) { for (auto key : _combine._switch_options.keys()) {
auto pair_str = QString("%1=%2").arg(key) auto pair_str = QString("%1=%2").arg(key)
.arg(_combines._switch_options[key]); .arg(_combine._switch_options[key]);
value_list << pair_str; value_list << pair_str;
} }
STRLIST_SAVE(value_list); STRLIST_SAVE(value_list);
@ -207,9 +209,9 @@ QVariant BytesAsString::parse(const QByteArray& bytes) const
return _strings._conv_with->toUnicode(bytes); return _strings._conv_with->toUnicode(bytes);
} }
void BytesAsString::loadFrom(const QJsonObject& obj) void BytesAsString::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
AbstractExtractor::loadFrom(obj); AbstractExtractor::loadFrom(core, obj);
QString codec_name; QString codec_name;
STRING_PEAK(codec_name); STRING_PEAK(codec_name);
@ -302,7 +304,7 @@ std::shared_ptr<ExtractUnit> BytesAsList::elementRule() const
return this->_list._bind_unit; return this->_list._bind_unit;
} }
bool BytesAsList::setElementRule(std::shared_ptr<ExtractUnit> u) bool BytesAsList::appendElementRule(std::shared_ptr<ExtractUnit> u)
{ {
this->_list._bind_unit = u; this->_list._bind_unit = u;
return true; return true;
@ -345,25 +347,32 @@ int BytesAsList::countWithin() const
* this->_list._bind_unit->countWithin(); * this->_list._bind_unit->countWithin();
} }
void BytesAsList::loadFrom(const QJsonObject& obj) #include "TranslateBasic.h"
void BytesAsList::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
INT32_PEAK(_list._bytes_offset); INT32_PEAK(_list._bytes_offset);
QString bind_unit_name = "";
QString bind_size_provider_name = "";
STRING_PEAK(bind_unit_name);
STRING_PEAK(bind_size_provider_name);
this->_list._bind_size_v = core->sizeProviders()[bind_size_provider_name];
this->_list._bind_unit = core->extactors()[bind_unit_name];
QString bind_provider_expr = ""; QString bind_provider_expr = "";
STRING_SAVE(bind_provider_expr); STRING_SAVE(bind_provider_expr);
if (this->_list._bind_size_v)
this->_list._bind_size_v->setExpression(bind_provider_expr); this->_list._bind_size_v->setExpression(bind_provider_expr);
} }
void BytesAsList::saveTo(QJsonObject& obj) const void BytesAsList::saveTo(QJsonObject& obj) const
{ {
INT32_SAVE(_list._bytes_offset);
QString bind_unit_name = ""; QString bind_unit_name = "";
if (this->_list._bind_unit) if (this->_list._bind_unit)
bind_unit_name = this->_list._bind_unit->name(); bind_unit_name = this->_list._bind_unit->name();
STRING_SAVE(bind_unit_name); STRING_SAVE(bind_unit_name);
INT32_SAVE(_list._bytes_offset);
QString bind_size_provider_name = ""; QString bind_size_provider_name = "";
QString bind_provider_expr = ""; QString bind_provider_expr = "";
if (this->_list._bind_size_v) { if (this->_list._bind_size_v) {
@ -425,9 +434,11 @@ QVariant BytesAsUnion::parse(const QByteArray& bytes) const
return QVariant(); return QVariant();
} }
void BytesAsUnion::loadFrom(const QJsonObject& obj) void BytesAsUnion::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{ {
throw std::logic_error("The method or operation is not implemented."); INT32_PEAK(_union.byte_count);
INT32_PEAK(_union.byte_offset);
} }
void BytesAsUnion::saveTo(QJsonObject& obj) const void BytesAsUnion::saveTo(QJsonObject& obj) const
@ -446,7 +457,7 @@ QList<std::shared_ptr<RuleMatch>> BytesAsUnion::elementRules() const
return _union._rule_list; return _union._rule_list;
} }
bool BytesAsUnion::setElementRule(std::shared_ptr<RuleMatch> u) bool BytesAsUnion::appendElementRule(std::shared_ptr<RuleMatch> u)
{ {
this->_union._rule_list << u; this->_union._rule_list << u;
return true; return true;

View File

@ -96,7 +96,7 @@ namespace extract {
int countWithin() const override; int countWithin() const override;
// Serializable ============================== // Serializable ==============================
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
}; };
@ -118,7 +118,7 @@ namespace extract {
public: public:
struct __Private { struct __Private {
QHash<int, QString> _switch_options; QHash<int, QString> _switch_options;
} _combines; } _combine;
BytesAsBitCombine(); BytesAsBitCombine();
@ -130,7 +130,7 @@ namespace extract {
QVariant parse(const QByteArray& bytes) const override; QVariant parse(const QByteArray& bytes) const override;
// Serializable ============================== // Serializable ==============================
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override; std::shared_ptr<Serializable> newDefault() const override;
}; };
@ -184,7 +184,7 @@ namespace extract {
QVariant parse(const QByteArray& bytes) const override; QVariant parse(const QByteArray& bytes) const override;
// Serializable ============================== // Serializable ==============================
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override; std::shared_ptr<Serializable> newDefault() const override;
}; };
@ -217,7 +217,7 @@ namespace extract {
public: public:
bool setOffsetSpan(int value); bool setOffsetSpan(int value);
std::shared_ptr<ExtractUnit> elementRule() const; std::shared_ptr<ExtractUnit> elementRule() const;
bool setElementRule(std::shared_ptr<ExtractUnit> u); bool appendElementRule(std::shared_ptr<ExtractUnit> u);
std::shared_ptr<SizeProvider> sizeProvider() const; std::shared_ptr<SizeProvider> sizeProvider() const;
bool setSizeProvider(std::shared_ptr<SizeProvider> ins); bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
@ -227,7 +227,7 @@ namespace extract {
int offsetSpan() const override; int offsetSpan() const override;
int countWithin() const override; int countWithin() const override;
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
QVariant parse(const QByteArray& bytes) const override; QVariant parse(const QByteArray& bytes) const override;
@ -238,7 +238,7 @@ namespace extract {
class BytesAsUnion : public ExtractUnit { class BytesAsUnion : public ExtractUnit {
public: public:
struct __Private { struct __Private {
int byte_offset, byte_count; int byte_offset = 0, byte_count = 1;
QList<std::shared_ptr<RuleMatch>> _rule_list; QList<std::shared_ptr<RuleMatch>> _rule_list;
} _union; } _union;
@ -247,7 +247,7 @@ namespace extract {
void clearRules(); void clearRules();
QList<std::shared_ptr<RuleMatch>> elementRules() const; QList<std::shared_ptr<RuleMatch>> elementRules() const;
bool setElementRule(std::shared_ptr<RuleMatch> u); bool appendElementRule(std::shared_ptr<RuleMatch> u);
public: public:
QString name() const override; QString name() const override;
@ -257,11 +257,10 @@ namespace extract {
int countWithin() const override; int countWithin() const override;
QVariant parse(const QByteArray& bytes) const override; QVariant parse(const QByteArray& bytes) const override;
void loadFrom(const QJsonObject& obj) override; void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override; void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override;
std::shared_ptr<Serializable> newDefault() const override;
}; };
} }