diff --git a/TranslateUI/TranslateBasic.cpp b/TranslateUI/TranslateBasic.cpp index 5868f11..5d3575c 100644 --- a/TranslateUI/TranslateBasic.cpp +++ b/TranslateUI/TranslateBasic.cpp @@ -185,7 +185,7 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const } else { auto last = bytes[bytes.size() - 1]; - auto mark = last == 0? 0: last / std::abs(last); + auto mark = last == 0 ? 0 : last / std::abs(last); auto xbuffer = bytes; if (mark >= 0) { @@ -204,3 +204,47 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const return *((long long*)(&value)); } } + +#include + +BytesAsString::BytesAsString() + :AbstractTranslateUnit(NAME(BytesAsString)){ + _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) +{ + AbstractTranslateUnit::loadFrom(obj); + + QString codec_name; + STRING_PEAK(codec_name); + this->_conv_with = QTextCodec::codecForName(codec_name.toLatin1()); +} + +void BytesAsString::saveTo(QJsonObject& obj) const +{ + AbstractTranslateUnit::saveTo(obj); + + auto codec_name = this->codecName(); + STRING_SAVE(codec_name); +} + +std::shared_ptr BytesAsString::newDefault() const +{ + return std::make_shared(); +} diff --git a/TranslateUI/TranslateBasic.h b/TranslateUI/TranslateBasic.h index 9375a40..9ef2b61 100644 --- a/TranslateUI/TranslateBasic.h +++ b/TranslateUI/TranslateBasic.h @@ -127,7 +127,9 @@ public: std::shared_ptr newDefault() const override; }; - +/// +/// 转换源数据为整形 +/// class BytesAsInteger : public AbstractTranslateUnit { private: bool unsigned_mark = false; @@ -146,10 +148,28 @@ public: void loadFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr 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; +/// +/// 转换源数据为字符串 +/// class BytesAsString : public AbstractTranslateUnit { private: - QTextCodec *_conv_with; + QTextCodec *_conv_with = nullptr; + +public: + BytesAsString(); + + void setStrCodec(QTextCodec *ins); + QString codecName() const; + + // TranslateUnit ============================ + QVariant parse(const QByteArray& bytes) const override; + + // Serializable ============================== + void loadFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + std::shared_ptr newDefault() const override; }; \ No newline at end of file diff --git a/TranslateUI/main.cpp b/TranslateUI/main.cpp index 17db6a5..f24bcbc 100644 --- a/TranslateUI/main.cpp +++ b/TranslateUI/main.cpp @@ -9,10 +9,9 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); QByteArray vbuf; - uint value = 122; + uint value = -122; vbuf.append((char*)&value, 4); BytesAsInteger u; - u.setUnsignedMark(true); qDebug() << u.parse(vbuf); return app.exec();