forked from romixlab/qmsgpack
work in progress...
This commit is contained in:
10
main.cpp
10
main.cpp
@@ -2,12 +2,18 @@
|
||||
#include <msgpack.h>
|
||||
#include <QDebug>
|
||||
|
||||
#include <vector>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication a(argc, argv);
|
||||
|
||||
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";
|
||||
// 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();
|
||||
}
|
||||
|
@@ -17,8 +17,10 @@ TEMPLATE = app
|
||||
|
||||
SOURCES += main.cpp \
|
||||
msgpack.cpp \
|
||||
private/msgpack_p.cpp
|
||||
private/pack_p.cpp \
|
||||
private/unpack_p.cpp
|
||||
|
||||
HEADERS += \
|
||||
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 <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 *end = p + data.size() - 1;
|
||||
//qDebug() << "deserialize size:" << data.size();
|
||||
|
||||
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
|
||||
{
|
||||
|
||||
QVariant deserialize(const QByteArray &data);
|
||||
QVariant unpack(const QByteArray &data);
|
||||
QByteArray pack(const QVariant &variant);
|
||||
}
|
||||
|
||||
#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>
|
||||
|
||||
MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
|
||||
@@ -30,8 +30,8 @@ QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
|
||||
if (p - end > 1)
|
||||
return QVariant();
|
||||
|
||||
// if (d.length() == 1)
|
||||
// return d[0];
|
||||
if (d.length() == 1)
|
||||
return d[0];
|
||||
return d;
|
||||
}
|
||||
|
Reference in New Issue
Block a user