This commit is contained in:
codeboss 2025-07-16 00:24:48 +08:00
parent 7b4ecfb9ea
commit e17fc39dc7
2 changed files with 88 additions and 8 deletions

View File

@ -1,7 +1,7 @@
#include "TranslateBasic.h" #include "TranslateBasic.h"
AbstractExtractor::AbstractExtractor(const QString& name) AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
:_name_store(name), _byte_offset(0), _byte_count(0) { :_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
} }
bool AbstractExtractor::setOffsetFromPrevious(int bytes) bool AbstractExtractor::setOffsetFromPrevious(int bytes)
@ -21,6 +21,11 @@ QString AbstractExtractor::name() const
return _name_store; return _name_store;
} }
DataType AbstractExtractor::outType() const
{
return _type_store;
}
int AbstractExtractor::offsetFromPrevious() const int AbstractExtractor::offsetFromPrevious() const
{ {
return _byte_offset; return _byte_offset;
@ -44,7 +49,7 @@ void AbstractExtractor::saveTo(QJsonObject& obj) const
} }
BytesAsHex::BytesAsHex() BytesAsHex::BytesAsHex()
: AbstractExtractor(NAME(BytesAsHex)) { : AbstractExtractor(NAME(BytesAsHex), DataType::ValueSequenceString) {
} }
QVariant BytesAsHex::parse(const QByteArray& bytes) const QVariant BytesAsHex::parse(const QByteArray& bytes) const
@ -62,7 +67,7 @@ std::shared_ptr<Serializable> BytesAsHex::newDefault() const
} }
BytesAsBitCombine::BytesAsBitCombine() BytesAsBitCombine::BytesAsBitCombine()
: AbstractExtractor(NAME(BytesAsBitCombine)) : AbstractExtractor(NAME(BytesAsBitCombine), DataType::TextString)
{ {
} }
@ -151,7 +156,7 @@ std::shared_ptr<Serializable> BytesAsInteger::newDefault() const
} }
BytesAsInteger::BytesAsInteger() BytesAsInteger::BytesAsInteger()
:AbstractExtractor(NAME(BytesAsInteger)) { :AbstractExtractor(NAME(BytesAsInteger), DataType::Int64) {
setCountWithinParse(8); setCountWithinParse(8);
} }
@ -208,7 +213,7 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const
#include <QTextCodec> #include <QTextCodec>
BytesAsString::BytesAsString() BytesAsString::BytesAsString()
:AbstractExtractor(NAME(BytesAsString)) { :AbstractExtractor(NAME(BytesAsString), DataType::TextString) {
_conv_with = QTextCodec::codecForName("GBK"); _conv_with = QTextCodec::codecForName("GBK");
} }
@ -248,3 +253,42 @@ std::shared_ptr<Serializable> BytesAsString::newDefault() const
{ {
return std::make_shared<BytesAsString>(); return std::make_shared<BytesAsString>();
} }
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);
}

View File

@ -31,7 +31,7 @@ public:
/// 内部使用的数据类型 /// 内部使用的数据类型
/// </summary> /// </summary>
enum class DataType { enum class DataType {
ValueString, ValueSequenceString,
TextString, TextString,
Int64, Int64,
Flt32, Flt32,
@ -51,6 +51,12 @@ public:
/// <returns></returns> /// <returns></returns>
virtual QString name() const = 0; virtual QString name() const = 0;
/// <summary>
///
/// </summary>
/// <returns></returns>
virtual DataType outType() const = 0;
/// <summary> /// <summary>
/// 从上一个单元字节偏移字节数量 /// 从上一个单元字节偏移字节数量
/// </summary> /// </summary>
@ -73,10 +79,11 @@ public:
class AbstractExtractor : public ExtractUnit { class AbstractExtractor : public ExtractUnit {
private: private:
QString _name_store; QString _name_store;
DataType _type_store;
int _byte_offset, _byte_count; int _byte_offset, _byte_count;
public: public:
AbstractExtractor(const QString& name); AbstractExtractor(const QString& name, DataType data);
/// <summary> /// <summary>
/// 设置偏移字节数量 /// 设置偏移字节数量
/// </summary> /// </summary>
@ -90,6 +97,7 @@ public:
// ExtractUnit =========================== // ExtractUnit ===========================
QString name() const override; QString name() const override;
virtual DataType outType() const;
int offsetFromPrevious() const override; int offsetFromPrevious() const override;
int countWithinParse() const override; int countWithinParse() const override;
@ -186,3 +194,31 @@ public:
std::shared_ptr<Serializable> newDefault() const override; std::shared_ptr<Serializable> newDefault() const override;
}; };
/// <summary>
/// Êýֵת»»³éÏó½Ó¿Ú
/// </summary>
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;
};