update
This commit is contained in:
parent
6027701a36
commit
9ba8763873
|
|
@ -1,361 +1 @@
|
|||
#include "TranslateBasic.h"
|
||||
|
||||
using namespace extract;
|
||||
using namespace convert;
|
||||
|
||||
AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
|
||||
:_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
|
||||
}
|
||||
|
||||
bool AbstractExtractor::setOffsetSpan(int bytes)
|
||||
{
|
||||
this->_byte_offset = bytes;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AbstractExtractor::setCountWithin(int bytes)
|
||||
{
|
||||
this->_byte_count = bytes;
|
||||
return true;
|
||||
}
|
||||
|
||||
QString AbstractExtractor::name() const
|
||||
{
|
||||
return _name_store;
|
||||
}
|
||||
|
||||
DataType AbstractExtractor::outType() const
|
||||
{
|
||||
return _type_store;
|
||||
}
|
||||
|
||||
int AbstractExtractor::offsetSpan() const
|
||||
{
|
||||
return _byte_offset;
|
||||
}
|
||||
|
||||
int AbstractExtractor::countWithin() const
|
||||
{
|
||||
return _byte_count;
|
||||
}
|
||||
|
||||
void AbstractExtractor::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
INT32_PEAK(_byte_offset);
|
||||
INT32_PEAK(_byte_count);
|
||||
}
|
||||
|
||||
void AbstractExtractor::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
INT32_SAVE(_byte_count);
|
||||
INT32_SAVE(_byte_offset);
|
||||
}
|
||||
|
||||
BytesAsHex::BytesAsHex()
|
||||
: AbstractExtractor(NAME(BytesAsHex), DataType::TextString) {
|
||||
}
|
||||
|
||||
QVariant BytesAsHex::parse(const QByteArray& bytes) const
|
||||
{
|
||||
QString result;
|
||||
for (auto char_v : bytes) {
|
||||
result += QString("%1").arg(char_v, 2, 16, QChar('0'));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsHex::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsHex>();
|
||||
}
|
||||
|
||||
BytesAsBitCombine::BytesAsBitCombine()
|
||||
: AbstractExtractor(NAME(BytesAsBitCombine), DataType::TextString)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
|
||||
{
|
||||
if (bit_index >= 0 && bit_index <= this->countWithin() * 8) {
|
||||
_switch_options[bit_index] = keyword;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QHash<int, QString> BytesAsBitCombine::switchOptions() const
|
||||
{
|
||||
return _switch_options;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::clearOptions()
|
||||
{
|
||||
_switch_options.clear();
|
||||
}
|
||||
|
||||
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
|
||||
{
|
||||
auto keys = _switch_options.keys();
|
||||
std::sort(keys.begin(), keys.end());
|
||||
|
||||
QString result;
|
||||
for (auto idx : keys) {
|
||||
auto byte_idx = idx / 8;
|
||||
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");
|
||||
else
|
||||
result += QString("%1<%2>;").arg(_switch_options[idx], "N");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
|
||||
QStringList value_list;
|
||||
STRLIST_PEAK(value_list);
|
||||
_switch_options.clear();
|
||||
for (auto pair : value_list) {
|
||||
auto items = pair.split("=");
|
||||
_switch_options[items.first().toInt()] = items.last();
|
||||
}
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
AbstractExtractor::saveTo(obj);
|
||||
|
||||
QStringList value_list;
|
||||
for (auto key : _switch_options.keys()) {
|
||||
auto pair = QString("%1=%2").arg(key).arg(_switch_options[key]);
|
||||
}
|
||||
STRLIST_SAVE(value_list);
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsBitCombine::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsBitCombine>();
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsInteger::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsInteger>();
|
||||
}
|
||||
|
||||
BytesAsInteger::BytesAsInteger()
|
||||
:AbstractExtractor(NAME(BytesAsInteger), DataType::Integer) {
|
||||
}
|
||||
|
||||
bool BytesAsInteger::setCountWithin(int bytes)
|
||||
{
|
||||
bytes = std::min(8, std::max(bytes, 0));
|
||||
return AbstractExtractor::setCountWithin(bytes);
|
||||
}
|
||||
|
||||
QVariant BytesAsInteger::parse(const QByteArray& bytes) const
|
||||
{
|
||||
auto last = bytes[bytes.size() - 1];
|
||||
auto mark = last == 0 ? 0 : last / std::abs(last);
|
||||
|
||||
auto xbuffer = bytes;
|
||||
if (mark >= 0) {
|
||||
xbuffer.append(8 - bytes.size(), 0);
|
||||
}
|
||||
else {
|
||||
xbuffer.append(8 - bytes.size(), 0xff);
|
||||
}
|
||||
|
||||
unsigned long long value = 0;
|
||||
for (auto vidx = xbuffer.size() - 1; vidx >= 0; vidx--) {
|
||||
auto vchar = xbuffer.at(vidx);
|
||||
value = value << 8;
|
||||
value += (uchar)vchar;
|
||||
}
|
||||
return *((long long*)(&value));
|
||||
}
|
||||
|
||||
|
||||
#include <QTextCodec>
|
||||
|
||||
BytesAsString::BytesAsString()
|
||||
:AbstractExtractor(NAME(BytesAsString), DataType::TextString) {
|
||||
_conv_with = QTextCodec::codecForName("GBK");
|
||||
}
|
||||
|
||||
void BytesAsString::setStrCodec(QTextCodec* ins)
|
||||
{
|
||||
this->_conv_with = ins;
|
||||
}
|
||||
|
||||
QString BytesAsString::codecName() const
|
||||
{
|
||||
return this->_conv_with->name();
|
||||
}
|
||||
|
||||
QVariant BytesAsString::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return _conv_with->toUnicode(bytes);
|
||||
}
|
||||
|
||||
void BytesAsString::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
|
||||
QString codec_name;
|
||||
STRING_PEAK(codec_name);
|
||||
this->_conv_with = QTextCodec::codecForName(codec_name.toLatin1());
|
||||
}
|
||||
|
||||
void BytesAsString::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
AbstractExtractor::saveTo(obj);
|
||||
|
||||
auto codec_name = this->codecName();
|
||||
STRING_SAVE(codec_name);
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsString::newDefault() const
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
DoubleWithLSB::DoubleWithLSB()
|
||||
:AbstractValueConvert(NAME(DoubleWithLSB), DataType::Integer, DataType::Dbl64),
|
||||
_lsb_value(1) {}
|
||||
|
||||
void DoubleWithLSB::setLSB(double lsbv)
|
||||
{
|
||||
this->_lsb_value = lsbv;
|
||||
}
|
||||
|
||||
double DoubleWithLSB::getLSB() const
|
||||
{
|
||||
return this->_lsb_value;
|
||||
}
|
||||
|
||||
QVariant DoubleWithLSB::convert(const QVariant& value) const
|
||||
{
|
||||
if (value.canConvert<int64_t>())
|
||||
return value.toLongLong() * this->_lsb_value;
|
||||
return value.toULongLong() * this->_lsb_value;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> DoubleWithLSB::newDefault() const
|
||||
{
|
||||
return std::make_shared<DoubleWithLSB>();
|
||||
}
|
||||
|
||||
QVariant BytesAsFloat::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((float*)bytes.data());
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsFloat::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsFloat>();
|
||||
}
|
||||
|
||||
bool BytesAsFloat::setCountWithin(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithin(4);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsFloat::BytesAsFloat()
|
||||
:AbstractExtractor(NAME(BytesAsFloat), DataType::Flt32)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsDouble::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsDouble>();
|
||||
}
|
||||
|
||||
QVariant BytesAsDouble::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((double*)bytes.data());
|
||||
}
|
||||
|
||||
bool BytesAsDouble::setCountWithin(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithin(8);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsDouble::BytesAsDouble()
|
||||
:AbstractExtractor(NAME(BytesAsDouble), DataType::Dbl64)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
BytesAsUnsigned::BytesAsUnsigned()
|
||||
:AbstractExtractor(NAME(BytesAsUnsigned), DataType::Unsigned)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool BytesAsUnsigned::setCountWithin(int bytes)
|
||||
{
|
||||
auto count = std::max(1, std::min(8, bytes));
|
||||
return AbstractExtractor::setCountWithin(count);
|
||||
}
|
||||
|
||||
QVariant BytesAsUnsigned::parse(const QByteArray& bytes) const
|
||||
{
|
||||
unsigned long long value = 0;
|
||||
for (auto vidx = bytes.size() - 1; vidx >= 0; vidx--) {
|
||||
auto vchar = bytes.at(vidx);
|
||||
value = value << 8;
|
||||
value += (uchar)vchar;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsUnsigned::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsUnsigned>();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,281 +1,4 @@
|
|||
#pragma once
|
||||
#include <QVariant>
|
||||
#include <QJsonObject>
|
||||
#include <memory>
|
||||
#include <QHash>
|
||||
|
||||
/// <summary>
|
||||
/// 序列化实体
|
||||
/// </summary>
|
||||
class Serializable {
|
||||
public:
|
||||
virtual ~Serializable() = default;
|
||||
/// <summary>
|
||||
/// 反序列化
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
virtual void loadFrom(const QJsonObject& obj) = 0;
|
||||
/// <summary>
|
||||
/// 序列化
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
virtual void saveTo(QJsonObject& obj) const = 0;
|
||||
/// <summary>
|
||||
/// 创建默认副本
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 内部使用的数据类型
|
||||
/// </summary>
|
||||
enum class DataType {
|
||||
TextString,
|
||||
Integer, // 整形
|
||||
Unsigned,// 无符号整形
|
||||
Flt32,
|
||||
Dbl64,
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 翻译单元抽象接口
|
||||
/// </summary>
|
||||
class ExtractUnit : public Serializable {
|
||||
public:
|
||||
virtual ~ExtractUnit() = default;
|
||||
|
||||
/// <summary>
|
||||
/// 单元名称
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual QString name() const = 0;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual DataType outType() const = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 从上一个单元字节偏移字节数量
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual int offsetSpan() const = 0;
|
||||
/// <summary>
|
||||
/// 解析所用的字节数量
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual int countWithin() const = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 执行解析过程
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns></returns>
|
||||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||||
};
|
||||
|
||||
namespace extract {
|
||||
class AbstractExtractor : public ExtractUnit {
|
||||
private:
|
||||
QString _name_store;
|
||||
DataType _type_store;
|
||||
int _byte_offset, _byte_count;
|
||||
|
||||
public:
|
||||
AbstractExtractor(const QString& name, DataType data);
|
||||
/// <summary>
|
||||
/// 设置偏移字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setOffsetSpan(int bytes);
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithin(int bytes);
|
||||
|
||||
// ExtractUnit ===========================
|
||||
QString name() const override;
|
||||
virtual DataType outType() const;
|
||||
int offsetSpan() const override;
|
||||
int countWithin() const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数值未16进制数值,默认分割方式
|
||||
/// </summary>
|
||||
class BytesAsHex : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsHex();
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数值为位联合
|
||||
/// </summary>
|
||||
class BytesAsBitCombine : public AbstractExtractor {
|
||||
private:
|
||||
QHash<int, QString> _switch_options;
|
||||
|
||||
public:
|
||||
BytesAsBitCombine();
|
||||
|
||||
bool setSwitchOption(int bit_index, const QString& keyword);
|
||||
QHash<int, QString> switchOptions() const;
|
||||
virtual void clearOptions();
|
||||
|
||||
// ExtractUnit ============================
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数据为整形
|
||||
/// </summary>
|
||||
class BytesAsInteger : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsInteger();
|
||||
|
||||
// ExtractUnit ============================
|
||||
bool setCountWithin(int bytes) override;
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
/// <summary>
|
||||
/// 转换源数据为整形
|
||||
/// </summary>
|
||||
class BytesAsUnsigned : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsUnsigned();
|
||||
|
||||
// ExtractUnit ============================
|
||||
bool setCountWithin(int bytes) override;
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数据为字符串
|
||||
/// </summary>
|
||||
class BytesAsString : public AbstractExtractor {
|
||||
private:
|
||||
QTextCodec* _conv_with = nullptr;
|
||||
|
||||
public:
|
||||
BytesAsString();
|
||||
|
||||
void setStrCodec(QTextCodec* ins);
|
||||
QString codecName() const;
|
||||
|
||||
// ExtractUnit ============================
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
class BytesAsFloat : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsFloat();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithin(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
class BytesAsDouble : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsDouble();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithin(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) 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;
|
||||
};
|
||||
|
||||
namespace convert {
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
class DoubleWithLSB : public AbstractValueConvert {
|
||||
private:
|
||||
double _lsb_value;
|
||||
|
||||
public:
|
||||
DoubleWithLSB();
|
||||
|
||||
void setLSB(double lsbv);
|
||||
double getLSB() const;
|
||||
|
||||
QVariant convert(const QVariant& value) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
}
|
||||
#include "extract_basic.h"
|
||||
#include "convert_basic.h"
|
||||
|
|
@ -92,6 +92,8 @@
|
|||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="convert_basic.cpp" />
|
||||
<ClCompile Include="extract_basic.cpp" />
|
||||
<ClCompile Include="SequenceView.cpp" />
|
||||
<ClCompile Include="TranslateBasic.cpp" />
|
||||
<QtRcc Include="TranslateUI.qrc" />
|
||||
|
|
@ -103,6 +105,9 @@
|
|||
<ClCompile Include="main.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="common.h" />
|
||||
<ClInclude Include="convert_basic.h" />
|
||||
<ClInclude Include="extract_basic.h" />
|
||||
<ClInclude Include="ParseUntility.h" />
|
||||
<QtMoc Include="SequenceView.h" />
|
||||
<ClInclude Include="StructuralRuleView.h" />
|
||||
|
|
|
|||
|
|
@ -52,6 +52,12 @@
|
|||
<ClCompile Include="StructuralRuleView.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="extract_basic.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="convert_basic.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ParseUntility.h">
|
||||
|
|
@ -63,6 +69,15 @@
|
|||
<ClInclude Include="StructuralRuleView.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="extract_basic.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="common.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="convert_basic.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ReadMe.md" />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
#pragma once
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <memory>
|
||||
|
||||
/// <summary>
|
||||
/// 序列化实体
|
||||
/// </summary>
|
||||
class Serializable {
|
||||
public:
|
||||
virtual ~Serializable() = default;
|
||||
/// <summary>
|
||||
/// 反序列化
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
virtual void loadFrom(const QJsonObject& obj) = 0;
|
||||
/// <summary>
|
||||
/// 序列化
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
virtual void saveTo(QJsonObject& obj) const = 0;
|
||||
/// <summary>
|
||||
/// 创建默认副本
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 内部使用的数据类型
|
||||
/// </summary>
|
||||
enum class DataType {
|
||||
TextString,
|
||||
Integer, // 整形
|
||||
Unsigned,// 无符号整形
|
||||
Flt32,
|
||||
Dbl64,
|
||||
LIST_COLLECTION,
|
||||
UNION_COMBINATE,
|
||||
};
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
#include "convert_basic.h"
|
||||
#include "extract_basic.h"
|
||||
#include <QVariant>
|
||||
|
||||
using namespace convert;
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
DoubleWithLSB::DoubleWithLSB()
|
||||
:AbstractValueConvert(NAME(DoubleWithLSB), DataType::Integer, DataType::Dbl64),
|
||||
_lsb_value(1) {
|
||||
}
|
||||
|
||||
void DoubleWithLSB::setLSB(double lsbv)
|
||||
{
|
||||
this->_lsb_value = lsbv;
|
||||
}
|
||||
|
||||
double DoubleWithLSB::getLSB() const
|
||||
{
|
||||
return this->_lsb_value;
|
||||
}
|
||||
|
||||
QVariant DoubleWithLSB::convert(const QVariant& value) const
|
||||
{
|
||||
if (value.canConvert<int64_t>())
|
||||
return value.toLongLong() * this->_lsb_value;
|
||||
return value.toULongLong() * this->_lsb_value;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> DoubleWithLSB::newDefault() const
|
||||
{
|
||||
return std::make_shared<DoubleWithLSB>();
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/// <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;
|
||||
};
|
||||
|
||||
namespace convert {
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
class DoubleWithLSB : public AbstractValueConvert {
|
||||
private:
|
||||
double _lsb_value;
|
||||
|
||||
public:
|
||||
DoubleWithLSB();
|
||||
|
||||
void setLSB(double lsbv);
|
||||
double getLSB() const;
|
||||
|
||||
QVariant convert(const QVariant& value) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,325 @@
|
|||
#include "extract_basic.h"
|
||||
#include <QVariant>
|
||||
|
||||
using namespace extract;
|
||||
|
||||
|
||||
AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
|
||||
:_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
|
||||
}
|
||||
|
||||
bool AbstractExtractor::setOffsetSpan(int bytes)
|
||||
{
|
||||
this->_byte_offset = bytes;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AbstractExtractor::setCountWithin(int bytes)
|
||||
{
|
||||
this->_byte_count = bytes;
|
||||
return true;
|
||||
}
|
||||
|
||||
QString AbstractExtractor::name() const
|
||||
{
|
||||
return _name_store;
|
||||
}
|
||||
|
||||
DataType AbstractExtractor::outType() const
|
||||
{
|
||||
return _type_store;
|
||||
}
|
||||
|
||||
int AbstractExtractor::offsetSpan() const
|
||||
{
|
||||
return _byte_offset;
|
||||
}
|
||||
|
||||
int AbstractExtractor::countWithin() const
|
||||
{
|
||||
return this->_byte_count;
|
||||
}
|
||||
|
||||
void AbstractExtractor::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
INT32_PEAK(_byte_offset);
|
||||
}
|
||||
|
||||
void AbstractExtractor::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
INT32_SAVE(_byte_offset);
|
||||
}
|
||||
|
||||
BytesAsHex::BytesAsHex()
|
||||
: AbstractExtractor(NAME(BytesAsHex), DataType::TextString) {
|
||||
}
|
||||
|
||||
QVariant BytesAsHex::parse(const QByteArray& bytes) const
|
||||
{
|
||||
QString result;
|
||||
for (auto char_v : bytes) {
|
||||
result += QString("%1").arg(char_v, 2, 16, QChar('0'));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsHex::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsHex>();
|
||||
}
|
||||
|
||||
BytesAsBitCombine::BytesAsBitCombine()
|
||||
: AbstractExtractor(NAME(BytesAsBitCombine), DataType::TextString)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
|
||||
{
|
||||
if (bit_index >= 0 && bit_index <= this->countWithin() * 8) {
|
||||
_switch_options[bit_index] = keyword;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QHash<int, QString> BytesAsBitCombine::switchOptions() const
|
||||
{
|
||||
return _switch_options;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::clearOptions()
|
||||
{
|
||||
_switch_options.clear();
|
||||
}
|
||||
|
||||
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
|
||||
{
|
||||
auto keys = _switch_options.keys();
|
||||
std::sort(keys.begin(), keys.end());
|
||||
|
||||
QString result;
|
||||
for (auto idx : keys) {
|
||||
auto byte_idx = idx / 8;
|
||||
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");
|
||||
else
|
||||
result += QString("%1<%2>;").arg(_switch_options[idx], "N");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
|
||||
QStringList value_list;
|
||||
STRLIST_PEAK(value_list);
|
||||
_switch_options.clear();
|
||||
for (auto pair : value_list) {
|
||||
auto items = pair.split("=");
|
||||
_switch_options[items.first().toInt()] = items.last();
|
||||
}
|
||||
}
|
||||
|
||||
void BytesAsBitCombine::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
AbstractExtractor::saveTo(obj);
|
||||
|
||||
QStringList value_list;
|
||||
for (auto key : _switch_options.keys()) {
|
||||
auto pair = QString("%1=%2").arg(key).arg(_switch_options[key]);
|
||||
}
|
||||
STRLIST_SAVE(value_list);
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsBitCombine::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsBitCombine>();
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsInteger::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsInteger>();
|
||||
}
|
||||
|
||||
BytesAsInteger::BytesAsInteger()
|
||||
:AbstractExtractor(NAME(BytesAsInteger), DataType::Integer) {
|
||||
}
|
||||
|
||||
bool BytesAsInteger::setCountWithin(int bytes)
|
||||
{
|
||||
bytes = std::min(8, std::max(bytes, 0));
|
||||
return AbstractExtractor::setCountWithin(bytes);
|
||||
}
|
||||
|
||||
QVariant BytesAsInteger::parse(const QByteArray& bytes) const
|
||||
{
|
||||
auto last = bytes[bytes.size() - 1];
|
||||
auto mark = last == 0 ? 0 : last / std::abs(last);
|
||||
|
||||
auto xbuffer = bytes;
|
||||
if (mark >= 0) {
|
||||
xbuffer.append(8 - bytes.size(), 0);
|
||||
}
|
||||
else {
|
||||
xbuffer.append(8 - bytes.size(), 0xff);
|
||||
}
|
||||
|
||||
unsigned long long value = 0;
|
||||
for (auto vidx = xbuffer.size() - 1; vidx >= 0; vidx--) {
|
||||
auto vchar = xbuffer.at(vidx);
|
||||
value = value << 8;
|
||||
value += (uchar)vchar;
|
||||
}
|
||||
return *((long long*)(&value));
|
||||
}
|
||||
|
||||
|
||||
#include <QTextCodec>
|
||||
|
||||
BytesAsString::BytesAsString()
|
||||
:AbstractExtractor(NAME(BytesAsString), DataType::TextString) {
|
||||
_conv_with = QTextCodec::codecForName("GBK");
|
||||
}
|
||||
|
||||
void BytesAsString::setStrCodec(QTextCodec* ins)
|
||||
{
|
||||
this->_conv_with = ins;
|
||||
}
|
||||
|
||||
QString BytesAsString::codecName() const
|
||||
{
|
||||
return this->_conv_with->name();
|
||||
}
|
||||
|
||||
QVariant BytesAsString::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return _conv_with->toUnicode(bytes);
|
||||
}
|
||||
|
||||
void BytesAsString::loadFrom(const QJsonObject& obj)
|
||||
{
|
||||
AbstractExtractor::loadFrom(obj);
|
||||
|
||||
QString codec_name;
|
||||
STRING_PEAK(codec_name);
|
||||
this->_conv_with = QTextCodec::codecForName(codec_name.toLatin1());
|
||||
}
|
||||
|
||||
void BytesAsString::saveTo(QJsonObject& obj) const
|
||||
{
|
||||
AbstractExtractor::saveTo(obj);
|
||||
|
||||
auto codec_name = this->codecName();
|
||||
STRING_SAVE(codec_name);
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsString::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsString>();
|
||||
}
|
||||
|
||||
QVariant BytesAsFloat::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((float*)bytes.data());
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsFloat::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsFloat>();
|
||||
}
|
||||
|
||||
bool BytesAsFloat::setCountWithin(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithin(4);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsFloat::BytesAsFloat()
|
||||
:AbstractExtractor(NAME(BytesAsFloat), DataType::Flt32)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsDouble::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsDouble>();
|
||||
}
|
||||
|
||||
QVariant BytesAsDouble::parse(const QByteArray& bytes) const
|
||||
{
|
||||
return *((double*)bytes.data());
|
||||
}
|
||||
|
||||
bool BytesAsDouble::setCountWithin(int bytes)
|
||||
{
|
||||
AbstractExtractor::setCountWithin(8);
|
||||
return true;
|
||||
}
|
||||
|
||||
BytesAsDouble::BytesAsDouble()
|
||||
:AbstractExtractor(NAME(BytesAsDouble), DataType::Dbl64)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
BytesAsUnsigned::BytesAsUnsigned()
|
||||
:AbstractExtractor(NAME(BytesAsUnsigned), DataType::Unsigned)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool BytesAsUnsigned::setCountWithin(int bytes)
|
||||
{
|
||||
auto count = std::max(1, std::min(8, bytes));
|
||||
return AbstractExtractor::setCountWithin(count);
|
||||
}
|
||||
|
||||
QVariant BytesAsUnsigned::parse(const QByteArray& bytes) const
|
||||
{
|
||||
unsigned long long value = 0;
|
||||
for (auto vidx = bytes.size() - 1; vidx >= 0; vidx--) {
|
||||
auto vchar = bytes.at(vidx);
|
||||
value = value << 8;
|
||||
value += (uchar)vchar;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsUnsigned::newDefault() const
|
||||
{
|
||||
return std::make_shared<BytesAsUnsigned>();
|
||||
}
|
||||
|
||||
#include <stdexcept>
|
||||
QVariant BytesAsList::parse(const QByteArray& bytes) const
|
||||
{
|
||||
throw std::logic_error("The method or operation is not implemented.");
|
||||
}
|
||||
|
||||
std::shared_ptr<Serializable> BytesAsList::newDefault() const
|
||||
{
|
||||
throw std::logic_error("The method or operation is not implemented.");
|
||||
}
|
||||
|
||||
bool BytesAsUnion::setSizeProvider(std::shared_ptr<SizeProvider> ins)
|
||||
{
|
||||
if(ins->value() < 1)
|
||||
return false;
|
||||
|
||||
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<Serializable> BytesAsUnion::newDefault() const
|
||||
{
|
||||
throw std::logic_error("The method or operation is not implemented.");
|
||||
}
|
||||
|
|
@ -0,0 +1,246 @@
|
|||
#pragma once
|
||||
|
||||
#include "common.h"
|
||||
#include <QHash>
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 翻译单元抽象接口
|
||||
/// </summary>
|
||||
class ExtractUnit : public Serializable {
|
||||
public:
|
||||
virtual ~ExtractUnit() = default;
|
||||
|
||||
/// <summary>
|
||||
/// 单元名称
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual QString name() const = 0;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual DataType outType() const = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 从上一个单元字节偏移字节数量
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual int offsetSpan() const = 0;
|
||||
/// <summary>
|
||||
/// 解析所用的字节数量
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
virtual int countWithin() const = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 执行解析过程
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns></returns>
|
||||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||||
};
|
||||
|
||||
namespace extract {
|
||||
class AbstractExtractor : public ExtractUnit {
|
||||
private:
|
||||
QString _name_store;
|
||||
DataType _type_store;
|
||||
int _byte_offset, _byte_count;
|
||||
|
||||
public:
|
||||
AbstractExtractor(const QString& name, DataType data);
|
||||
/// <summary>
|
||||
/// 设置偏移字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setOffsetSpan(int bytes);
|
||||
virtual bool setCountWithin(int bytes);
|
||||
|
||||
// ExtractUnit ===========================
|
||||
QString name() const override;
|
||||
virtual DataType outType() const;
|
||||
int offsetSpan() const override;
|
||||
int countWithin() const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
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;
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数值未16进制数值,默认分割方式
|
||||
/// </summary>
|
||||
class BytesAsHex : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsHex();
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数值为位联合
|
||||
/// </summary>
|
||||
class BytesAsBitCombine : public AbstractExtractor {
|
||||
private:
|
||||
QHash<int, QString> _switch_options;
|
||||
|
||||
public:
|
||||
BytesAsBitCombine();
|
||||
|
||||
bool setSwitchOption(int bit_index, const QString& keyword);
|
||||
QHash<int, QString> switchOptions() const;
|
||||
virtual void clearOptions();
|
||||
|
||||
// ExtractUnit ============================
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数据为整形
|
||||
/// </summary>
|
||||
class BytesAsInteger : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsInteger();
|
||||
|
||||
// ExtractUnit ============================
|
||||
bool setCountWithin(int bytes) override;
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
/// <summary>
|
||||
/// 转换源数据为整形
|
||||
/// </summary>
|
||||
class BytesAsUnsigned : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsUnsigned();
|
||||
|
||||
// ExtractUnit ============================
|
||||
bool setCountWithin(int bytes) override;
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 转换源数据为字符串
|
||||
/// </summary>
|
||||
class BytesAsString : public AbstractExtractor {
|
||||
private:
|
||||
QTextCodec* _conv_with = nullptr;
|
||||
|
||||
public:
|
||||
BytesAsString();
|
||||
|
||||
void setStrCodec(QTextCodec* ins);
|
||||
QString codecName() const;
|
||||
|
||||
// ExtractUnit ============================
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
// Serializable ==============================
|
||||
void loadFrom(const QJsonObject& obj) override;
|
||||
void saveTo(QJsonObject& obj) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
class BytesAsFloat : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsFloat();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithin(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
class BytesAsDouble : public AbstractExtractor {
|
||||
public:
|
||||
BytesAsDouble();
|
||||
|
||||
/// <summary>
|
||||
/// 设置解析字节数量
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
virtual bool setCountWithin(int bytes) override;
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 尺寸解析器
|
||||
/// </summary>
|
||||
class SizeProvider {
|
||||
public:
|
||||
/// <summary>
|
||||
/// 获取值,如果该值无法预先计算得知,返回-1
|
||||
/// </summary>
|
||||
/// <returns>尺寸值</returns>
|
||||
virtual int32_t value() const = 0;
|
||||
virtual QString expression() const = 0;
|
||||
};
|
||||
class BytesAsList : public AbstractExtractor {
|
||||
|
||||
public:
|
||||
std::shared_ptr<ExtractUnit> elementRule() const;
|
||||
bool setElementRule(std::shared_ptr<ExtractUnit> u);
|
||||
|
||||
/// <summary>
|
||||
/// 设置尺寸解析器,返回值标志是否接受该设置
|
||||
/// </summary>
|
||||
/// <param name="ins"></param>
|
||||
/// <returns>true-有效,false-无效</returns>
|
||||
virtual bool setSizeProvider(std::shared_ptr<SizeProvider> ins) = 0;
|
||||
|
||||
|
||||
public:
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
|
||||
};
|
||||
|
||||
class RuleMatch {
|
||||
public:
|
||||
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
|
||||
virtual bool checkpass() const = 0;
|
||||
};
|
||||
class BytesAsUnion : public AbstractExtractor {
|
||||
protected:
|
||||
std::shared_ptr<SizeProvider> _provider_ins = nullptr;
|
||||
|
||||
public:
|
||||
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
|
||||
|
||||
|
||||
QVariant parse(const QByteArray& bytes) const override;
|
||||
|
||||
|
||||
std::shared_ptr<Serializable> newDefault() const override;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue