msgpack原理分析

                       

一、简单介绍msgpack

1)原理

基本编码格式,核心压缩方式可参看官方说明messagepack specification

Overview

format namefirst byte (in binary)first byte (in hex)
positive fixint0xxxxxxx0x00 - 0x7f
fixmap1000xxxx0x80 - 0x8f
fixarray1001xxxx0x90 - 0x9f
fixstr101xxxxx0xa0 - 0xbf
nil110000000xc0
(never used)110000010xc1
false110000100xc2
true110000110xc3
bin 8110001000xc4
bin 16110001010xc5
bin 32110001100xc6
ext 8110001110xc7
ext 16110010000xc8
ext 32110010010xc9
float 32110010100xca
float 64110010110xcb
uint 8110011000xcc
uint 16110011010xcd
uint 32110011100xce
uint 64110011110xcf
int 8110100000xd0
int 16110100010xd1
int 32110100100xd2
int 64110100110xd3
fixext 1110101000xd4
fixext 2110101010xd5
fixext 4110101100xd6
fixext 8110101110xd7
fixext 16110110000xd8
str 8110110010xd9
str 16110110100xda
str 32110110110xdb
array 16110111000xdc
array 32110111010xdd
map 16110111100xde
map 32110111110xdf
negative fixint111xxxxx

2)  解析数据类型

// msg数据类型,在源码object.h里面可以直接看到

typedef enum {

    MSGPACK_OBJECT_NIL                  = 0x00,

    MSGPACK_OBJECT_BOOLEAN              = 0x01,

    MSGPACK_OBJECT_POSITIVE_INTEGER     = 0x02,

    MSGPACK_OBJECT_NEGATIVE_INTEGER     = 0x03,

    MSGPACK_OBJECT_FLOAT32              = 0x0a,

    MSGPACK_OBJECT_FLOAT64              = 0x04,

    MSGPACK_OBJECT_FLOAT                = 0x04,

#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)

    MSGPACK_OBJECT_DOUBLE               = MSGPACK_OBJECT_FLOAT, /* obsolete */

#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */

    MSGPACK_OBJECT_STR                  = 0x05,

    MSGPACK_OBJECT_ARRAY                = 0x06,

    MSGPACK_OBJECT_MAP                  = 0x07,

    MSGPACK_OBJECT_BIN                  = 0x08,

    MSGPACK_OBJECT_EXT                  = 0x09

} msgpack_object_type;

 

 

struct msgpack_object; // 数据类型对象

struct msgpack_object_kv; // map数据类型的key和value的对像

 

// 类型为数组类型的数据结构

typedef struct {

    uint32_t size;

    struct msgpack_object* ptr;

} msgpack_object_array;

 

// 数据类型为map的数据结构

typedef struct {

    uint32_t size;

    struct msgpack_object_kv* ptr;

} msgpack_object_map;

 

// 数据类型为str

typedef struct {

    uint32_t size;   //对应的str长度

    const char* ptr; // 指向str的数据,该数据不一定有结束符

} msgpack_object_str;

 

typedef struct {

    uint32_t size;

    const char* ptr;

} msgpack_object_bin;

 

typedef struct {

    int8_t type;

    uint32_t size;

    const char* ptr;

} msgpack_object_ext;

 

 

 

typedef union {

    bool boolean;

    uint64_t u64;

    int64_t  i64;

#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)

    double   dec; /* obsolete*/

#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */

    double   f64;

    msgpack_object_array array;

    msgpack_object_map map;

    msgpack_object_str str;

    msgpack_object_bin bin;

    msgpack_object_ext ext;

} msgpack_object_union;

 

typedef struct msgpack_object {

    msgpack_object_type type; // 该对象的数据类型

    msgpack_object_union via; // 具体存放的数据

} msgpack_object;

 

typedef struct msgpack_object_kv {

    msgpack_object key; // 存放map的key值

    msgpack_object val; // 存放map的value值

} msgpack_object_kv;

3)简单分析msgpack例子

一个简单的例子:

json格式:{"age":14, "subject":["math", "chinese", "english"]}

msgpack格式: 82 a3 61 67 65 0e a7 73 75 62 6a 65 63 74 93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68


     
    msgpack : 82 a3 61 67 65 0e a7 73 75 62 6a 65 63 74 93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68
         82 :两组map,即两组key-value pairs of objects
         a3 61 67 65 :第一组map的key,类型为fixstr为 "age"
         0e :第一组map的value,类型为positive fixint为14


         a7 73 75 62 6a 65 63 74 :第二组map的key,类型为fixstr为“subject”
         93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68 :第二组map的value是个array,元素内容为str
         93:有三组的数据的数组
         a4 6d 61 74 68:第一个数组对象类型为fixstr为"math"
         a7 63 68 69 6e 65 73 65 :第二个数组对象类型为fixstr为"chinese"
        a7 65 6e 67 6c 69 73 68:第三个数组对象类型为fixstr为"english"

 

二、Msgpack的解析存储结构

 

例子:

json       :   {"age":14, "subject":["math", "chinese", "english"]}

msgpack:82 a3 61 67 65 0e a7 73 75 62 6a 65 63 74 93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68

 

map

类型

value

.type(0x82)

MSGPACK_OBJECT_MAP

.via.map.size

0(如果全部加载完变为2)

.via.map.ptr

指向分配的内存的大小为2*sizeof(msgpack_object_kv),用存放接下来的2个map,即map.ptr[0]、map.ptr[1]

 

map.size=1;

map.ptr[0]

类型

key

.type(a3)

MSGPACK_OBJECT_STR

.via.str.size

3

.via.str.ptr(61 67 65)

指向”age”

value

.type(0e)

MSGPACK_OBJECT_POSITIVE_INTEGER

.via.u64

14

map.size=2;

map.ptr[1]

类型

key

.type(a7)

MSGPACK_OBJECT_STR

.via.str.size

7

.via.str.ptr(73 75 62 6a 65 63 74)

指向”subject”

value

.type(93)

MSGPACK_OBJECT_ARRAY

.via.array.size

0(如果全部加载完变为3)

.via.array.ptr

指向分配的内存的大小为3*sizeof(msgpack_object),用存放接下来的三个元素,即array.ptr[0]、array.ptr[1]、array.ptr[2]

 

 

array

类型

array.size=1

array.ptr[0]

.type(a4)

MSGPACK_OBJECT_STR

.via.str.size

4

.via.str.ptr(6d 61 74 68)

指向”math”

array.size=2

array.ptr[1]

.type(a7)

MSGPACK_OBJECT_STR

.via.str.size

7

.via.str.ptr(63 68 69 6e 65 73 65)

指向”chinese”

array.size=3

array.ptr[2]

.type(a7)

MSGPACK_OBJECT_STR

.via.str.size

7

.via.str.ptr(65 6e 67 6c 69 73 68)

指向”english”

图形描述:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值