添加了Double和Float固定长度解析

This commit is contained in:
codeboss 2025-07-19 00:38:08 +08:00
parent 26821f9543
commit 396a9e31b7
5 changed files with 228 additions and 205 deletions

View File

@ -2,6 +2,9 @@
#include <QSpinBox>
#include <QJsonDocument>
#include <QJsonObject>
#include "TranslateBasic.h"
using namespace extract;
IntDelegate::IntDelegate(int min, int max)
: _min_value(min), _max_value(max) {
@ -32,7 +35,6 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt
editor->setGeometry(option.rect);
}
#include "TranslateBasic.h"
void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
{
auto new_inst = _rule_sequence.at(idx.row());
@ -159,6 +161,12 @@ TranslateBasic::TranslateBasic()
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;
}
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const

View File

@ -8,73 +8,9 @@
#include <QTabWidget>
BinaryStructView::BinaryStructView(QWidget* p /*= nullptr*/)
StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
:QWidget(p),
_name_enter(new QLineEdit(this)),
_base_type(new QComboBox(this)),
_ends_set(new QComboBox(this)),
_bin_layout(new QTableView(this)),
_bin_model(new QStandardItemModel(this)),
_struct_layout(new QTreeView(this)),
_struct_model(new QStandardItemModel(this)),
_translate_layout(new QTreeView(this)),
_translate_model(new QStandardItemModel(this))
_sequence_view(new SequenceRulesView(this)),
_configs_stack(new QStackedWidget(this))
{
auto layout = new QGridLayout(this);
//layout->setSpacing(10);
layout->addWidget(new QLabel(tr("Unit Name:"), this));
layout->addWidget(_name_enter, 0, 1);
layout->addWidget(new QLabel(tr("Base On:"), this), 0, 2);
layout->addWidget(_base_type, 0, 3);
layout->addWidget(new QLabel(tr("Basedata Endian Appoint:"), this), 0, 4);
layout->addWidget(_ends_set, 0, 5);
auto btn = new QPushButton(tr("Save"), this);
layout->addWidget(btn, 0, 6);
auto h_splitter = new QSplitter(Qt::Horizontal, this);
layout->addWidget(h_splitter, 1, 0, 3, 7);
auto splitter = new QSplitter(Qt::Vertical, this);
h_splitter->addWidget(splitter);
auto translation_panel = new QGroupBox(tr("Translation Detail"), this);
auto translation_layout = new QGridLayout(translation_panel);
translation_layout->addWidget(this->_translate_layout);
h_splitter->addWidget(translation_panel);
auto bin_panel = new QGroupBox(tr("Sequence Define"));
auto bin_layout = new QGridLayout(bin_panel);
bin_layout->addWidget(_bin_layout);
splitter->addWidget(bin_panel);
auto struct_panel = new QGroupBox(tr("Structual Preview"), this);
auto struct_layout = new QGridLayout(struct_panel);
struct_layout->addWidget(_struct_layout);
splitter->addWidget(struct_panel);
// =======================
_base_type->addItems(QStringList()<<tr("Struct Based")<<tr("Union Based"));
_ends_set->addItems(QStringList() << tr("little-endian") << tr("big-endian"));
_bin_layout->setModel(_bin_model);
_struct_layout->setModel(_struct_model);
_translate_layout->setModel(this->_translate_model);
_bin_model->setHorizontalHeaderLabels(QStringList() << tr("Member Name") << tr("Logical Type") << tr("Base Type")
<< tr("Bytes Offset") << tr("Bytes Count") << tr("Translate Type") << tr("Rule Custom") << tr("Result With"));
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"单元标志")<< new QStandardItem(u8"数据")
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem("1*1")
<< new QStandardItem(u8"直译") << new QStandardItem(u8"文本转换") << new QStandardItem(u8"To=16进制"));
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"集合尺寸") << new QStandardItem(u8"数据")
<< new QStandardItem(u8"UINT16") << new QStandardItem("0") << new QStandardItem(u8"2*1")
<< new QStandardItem(u8"直译") << new QStandardItem(u8"数值提取") << new QStandardItem(u8"To=int,LSB=10"));
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"变长数据") << new QStandardItem(u8"集合")
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem(u8"1*集合尺寸"));
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"联合数据") << new QStandardItem(u8"联合")
<< new QStandardItem(u8"X联合") << new QStandardItem("0") << new QStandardItem(u8"8*1"));
_struct_model->setHorizontalHeaderLabels(QStringList() << tr("Fields") << tr("Comment"));
_translate_model->setHorizontalHeaderLabels(QStringList() << tr("Apply Condition") << tr("Translate Type") << tr("RuleBase") << tr("Result With"));
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=16进制"));
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=float,LSB=0.1"));
}

View File

@ -4,22 +4,17 @@
#include <QStandardItemModel>
#include <QTreeView>
#include <QLineEdit>
#include <QStackedWidget>
#include "SequenceView.h"
class BinaryStructView : public QWidget
class StructuralRuleView : public QWidget
{
private:
QLineEdit *const _name_enter;
QComboBox *const _base_type;
QComboBox *const _ends_set;
QTableView *const _bin_layout;
QStandardItemModel* const _bin_model;
QTreeView* const _struct_layout;
QStandardItemModel* const _struct_model;
QTreeView* const _translate_layout;
QStandardItemModel* const _translate_model;
SequenceRulesView *const _sequence_view;
QStackedWidget *const _configs_stack;
public:
BinaryStructView(QWidget* p = nullptr);
StructuralRuleView(QWidget* p = nullptr);
};

View File

@ -1,5 +1,8 @@
#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) {
}
@ -321,3 +324,47 @@ 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::setCountWithinParse(int bytes)
{
AbstractExtractor::setCountWithinParse(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::setCountWithinParse(int bytes)
{
AbstractExtractor::setCountWithinParse(8);
return true;
}
BytesAsDouble::BytesAsDouble()
:AbstractExtractor(NAME(BytesAsDouble), DataType::Dbl64)
{
}

View File

@ -2,6 +2,7 @@
#include <QVariant>
#include <QJsonObject>
#include <memory>
#include <QHash>
/// <summary>
/// 序列化实体
@ -26,7 +27,6 @@ public:
virtual std::shared_ptr<Serializable> newDefault() const = 0;
};
/// <summary>
/// 内部使用的数据类型
/// </summary>
@ -38,6 +38,9 @@ enum class DataType {
Dbl64,
};
/// <summary>
/// 翻译单元抽象接口
/// </summary>
@ -76,123 +79,155 @@ public:
virtual QVariant parse(const QByteArray& bytes) const = 0;
};
class AbstractExtractor : public ExtractUnit {
private:
QString _name_store;
DataType _type_store;
int _byte_offset, _byte_count;
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 setOffsetFromPrevious(int bytes);
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithinParse(int bytes);
public:
AbstractExtractor(const QString& name, DataType data);
/// <summary>
/// 设置偏移字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setOffsetFromPrevious(int bytes);
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithinParse(int bytes);
// ExtractUnit ===========================
QString name() const override;
virtual DataType outType() const;
int offsetFromPrevious() const override;
int countWithinParse() const override;
// ExtractUnit ===========================
QString name() const override;
virtual DataType outType() const;
int offsetFromPrevious() const override;
int countWithinParse() const override;
// Serializable ==============================
void loadFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) 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(";");
/// <summary>
/// 转换源数值未16进制数值默认分割方式
/// </summary>
class BytesAsHex : public AbstractExtractor {
public:
BytesAsHex();
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
#include <QHash>
/// <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 {
private:
bool unsigned_mark = false;
public:
BytesAsInteger();
void setUnsignedMark(bool ste);
bool unsignedMark() const;
// ExtractUnit ============================
bool setCountWithinParse(int bytes) override;
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;
};
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
/// <summary>
/// 转换源数据为字符串
/// </summary>
class BytesAsString : public AbstractExtractor {
private:
QTextCodec* _conv_with = nullptr;
public:
BytesAsString();
/// <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 {
private:
bool unsigned_mark = false;
public:
BytesAsInteger();
void setUnsignedMark(bool ste);
bool unsignedMark() const;
// ExtractUnit ============================
bool setCountWithinParse(int bytes) override;
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 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 setCountWithinParse(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 setCountWithinParse(int bytes) override;
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
}
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;
};
/// <summary>
/// 数值转换抽象接口
@ -204,36 +239,38 @@ public:
virtual QString name() const = 0;
virtual DataType inType() const = 0;
virtual DataType outType() const = 0;
virtual QVariant convert(const QVariant &value) const = 0;
virtual QVariant convert(const QVariant& value) const = 0;
};
class AbstractValueConvert : public ValueConvert {
private:
QString _name_store;
DataType _in_type, _out_type;
namespace convert {
class AbstractValueConvert : public ValueConvert {
private:
QString _name_store;
DataType _in_type, _out_type;
public:
AbstractValueConvert(const QString &nm, DataType in, DataType out);
public:
AbstractValueConvert(const QString& nm, DataType in, DataType out);
QString name() const override;
DataType inType() const override;
DataType outType() const override;
QString name() const override;
DataType inType() const override;
DataType outType() const override;
void loadFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
void loadFrom(const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
class DoubleWithLSB : public AbstractValueConvert {
private:
double _lsb_value;
class DoubleWithLSB : public AbstractValueConvert {
private:
double _lsb_value;
public:
DoubleWithLSB();
public:
DoubleWithLSB();
void setLSB(double lsbv);
double getLSB() const;
void setLSB(double lsbv);
double getLSB() const;
QVariant convert(const QVariant& value) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
QVariant convert(const QVariant& value) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
}