mirror of
https://github.com/romixlab/qmsgpack.git
synced 2025-09-26 05:30:55 +02:00
work in progress...
This commit is contained in:
10
main.cpp
10
main.cpp
@@ -2,12 +2,18 @@
|
|||||||
#include <msgpack.h>
|
#include <msgpack.h>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QCoreApplication a(argc, argv);
|
QCoreApplication a(argc, argv);
|
||||||
|
|
||||||
qDebug() << "MsgPack";
|
// qDebug() << "MsgPack";
|
||||||
qDebug() << MsgPack::deserialize(QByteArray::fromHex("dc 00 33 c2 c3 c0 00 00 00 00 00 00 00 00 00 ff ff ff ff ff 7f 7f cc ff cd ff ff ce ff ff ff ff e0 e0 d1 ff 80 d2 ff ff 80 00 d3 ff ff ff ff 80 00 00 00 00 00 01 ff a1 61 a1 61 a1 61 a0 a0 a0 91 00 91 00 91 00 90 90 90 80 80 80 81 a1 61 61 81 a1 61 61 81 a1 61 61 91 90 91 91 a1 61"));
|
// qDebug() << MsgPack::deserialize(QByteArray::fromHex("dc 00 33 c2 c3 c0 00 00 00 00 00 00 00 00 00 ff ff ff ff ff 7f 7f cc ff cd ff ff ce ff ff ff ff e0 e0 d1 ff 80 d2 ff ff 80 00 d3 ff ff ff ff 80 00 00 00 00 00 01 ff a1 61 a1 61 a1 61 a0 a0 a0 91 00 91 00 91 00 90 90 90 80 80 80 81 a1 61 61 81 a1 61 61 81 a1 61 61 91 90 91 91 a1 61"));
|
||||||
|
QVariantList l;
|
||||||
|
l << true << false;
|
||||||
|
QByteArray arr = MsgPack::pack(l);
|
||||||
|
qDebug() << arr << arr.toBase64();
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
@@ -17,8 +17,10 @@ TEMPLATE = app
|
|||||||
|
|
||||||
SOURCES += main.cpp \
|
SOURCES += main.cpp \
|
||||||
msgpack.cpp \
|
msgpack.cpp \
|
||||||
private/msgpack_p.cpp
|
private/pack_p.cpp \
|
||||||
|
private/unpack_p.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
msgpack.h \
|
msgpack.h \
|
||||||
private/msgpack_p.h
|
private/pack_p.h \
|
||||||
|
private/unpack_p.h
|
||||||
|
22
msgpack.cpp
22
msgpack.cpp
@@ -1,12 +1,28 @@
|
|||||||
#include "msgpack.h"
|
#include "msgpack.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include "private/msgpack_p.h"
|
#include "private/unpack_p.h"
|
||||||
|
#include "private/pack_p.h"
|
||||||
|
#include <QByteArray>
|
||||||
|
|
||||||
QVariant MsgPack::deserialize(const QByteArray &data)
|
QVariant MsgPack::unpack(const QByteArray &data)
|
||||||
{
|
{
|
||||||
quint8 *p = (quint8 *)data.data();
|
quint8 *p = (quint8 *)data.data();
|
||||||
quint8 *end = p + data.size() - 1;
|
quint8 *end = p + data.size() - 1;
|
||||||
//qDebug() << "deserialize size:" << data.size();
|
|
||||||
|
|
||||||
return MsgPackPrivate::unpack(p, end);
|
return MsgPackPrivate::unpack(p, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QByteArray MsgPack::pack(const QVariant &variant)
|
||||||
|
{
|
||||||
|
quint8 *p = 0;
|
||||||
|
quint8 *end = MsgPackPrivate::pack(variant, p, true);
|
||||||
|
quint32 size = end - p;
|
||||||
|
qDebug() << "size probe:" << size;
|
||||||
|
|
||||||
|
QByteArray arr;
|
||||||
|
arr.resize(size);
|
||||||
|
end = MsgPackPrivate::pack(variant, (quint8 *)arr.data(), false);
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
@@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
namespace MsgPack
|
namespace MsgPack
|
||||||
{
|
{
|
||||||
|
QVariant unpack(const QByteArray &data);
|
||||||
QVariant deserialize(const QByteArray &data);
|
QByteArray pack(const QVariant &variant);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // MSGPACK_H
|
#endif // MSGPACK_H
|
||||||
|
41
private/pack_p.cpp
Normal file
41
private/pack_p.cpp
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#include "pack_p.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool sp)
|
||||||
|
{
|
||||||
|
QMetaType::Type t = (QMetaType::Type)v.type();
|
||||||
|
if (t == QMetaType::Int)
|
||||||
|
p = pack_int(v, p, sp);
|
||||||
|
else if (t == QMetaType::Bool)
|
||||||
|
p = pack_bool(v, p, sp);
|
||||||
|
else if (t == QMetaType::QVariantList)
|
||||||
|
p = pack_list(v, p, sp);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
quint8 *MsgPackPrivate::pack_int(const QVariant &v, quint8 *p, bool sp)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
quint8 *MsgPackPrivate::pack_bool(const QVariant &v, quint8 *p, bool sp)
|
||||||
|
{
|
||||||
|
if (!sp)
|
||||||
|
*p = v.toBool() ? 0xc3 : 0xc2;
|
||||||
|
return p + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
quint8 *MsgPackPrivate::pack_list(const QVariant &v, quint8 *p, bool sp)
|
||||||
|
{
|
||||||
|
QVariantList list = v.toList();
|
||||||
|
//pack_int(...)
|
||||||
|
if (!sp)
|
||||||
|
*p = 0x92; // 2el
|
||||||
|
p++;
|
||||||
|
foreach (QVariant item, v.toList())
|
||||||
|
p = pack(item, p, sp);
|
||||||
|
return p;
|
||||||
|
}
|
19
private/pack_p.h
Normal file
19
private/pack_p.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef PACK_P_H
|
||||||
|
#define PACK_P_H
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
namespace MsgPackPrivate {
|
||||||
|
/* if sp (size probe) == true, packer just moves pointer forward
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
quint8 * pack(const QVariant &v, quint8 *p, bool sp);
|
||||||
|
|
||||||
|
quint8 * pack_int(const QVariant &v, quint8 *p, bool sp);
|
||||||
|
quint8 * pack_bool(const QVariant &v, quint8 *p, bool sp);
|
||||||
|
quint8 * pack_list(const QVariant &v, quint8 *p, bool sp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // PACK_P_H
|
@@ -1,4 +1,4 @@
|
|||||||
#include "msgpack_p.h"
|
#include "unpack_p.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
|
MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
|
||||||
@@ -30,8 +30,8 @@ QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
|
|||||||
if (p - end > 1)
|
if (p - end > 1)
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
// if (d.length() == 1)
|
if (d.length() == 1)
|
||||||
// return d[0];
|
return d[0];
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue
Block a user