QBinaryTranslate/TranslateUI/TranslateBasic.h

155 lines
3.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <QVariant>
#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>
class TranslateUnit : public Serializable {
public:
virtual ~TranslateUnit() = default;
/// <summary>
/// 单元名称
/// </summary>
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
/// 从上一个单元字节偏移字节数量
/// </summary>
/// <returns></returns>
virtual int offsetFromPrevious() const = 0;
/// <summary>
/// 解析所用的字节数量
/// </summary>
/// <returns></returns>
virtual int countWithinParse() const = 0;
/// <summary>
/// 执行解析过程
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
virtual QVariant parse(const QByteArray &bytes) const = 0;
};
class AbstractTranslateUnit : public TranslateUnit {
private:
QString _name_store;
int _byte_offset, _byte_count;
public:
AbstractTranslateUnit(const QString &name);
/// <summary>
/// 设置偏移字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setOffsetFromPrevious(int bytes);
/// <summary>
/// 设置解析字节数量
/// </summary>
/// <param name="bytes"></param>
virtual bool setCountWithinParse(int bytes);
// TranslateUnit ===========================
QString name() const override;
int offsetFromPrevious() const override;
int countWithinParse() 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 AbstractTranslateUnit {
public:
BytesAsHex();
QVariant parse(const QByteArray& bytes) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
#include <QHash>
/// <summary>
/// 转换源数值为位联合
/// </summary>
class BytesAsBitCombine : public AbstractTranslateUnit {
private:
QHash<int, QString> _switch_options;
public:
BytesAsBitCombine();
bool setSwitchOption(int bit_index, const QString& keyword);
QHash<int, QString> switchOptions() const;
virtual void clearOptions();
// TranslateUnit ============================
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 BytesAsInteger : public AbstractTranslateUnit {
private:
bool unsigned_mark = false;
public:
BytesAsInteger();
void setUnsignedMark(bool ste);
bool unsignedMark() const;
// TranslateUnit ============================
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;
};
class BytesAsString : public AbstractTranslateUnit {
private:
QTextCodec *_conv_with;
};