Tutorial

How to compile

msgpack-c 是一个只有头文件的库。您只需将 msgpack-c/include 添加到编译器包含路径即可。

g++ -Ipath_to_msgpack-c/include your_source.cpp

Checking the version

为了使用 msgpack-c,您需要在源代码中包含 msgpack.hpp。它是一个方便的头文件,包含所有 msgpack-c 功能。

包含头文件后,建议查看msgpack-c的版本。

Here is an example:

#include <iostream>

#include <msgpack.hpp>

int main() {
    std::cout << MSGPACK_VERSION << std::endl;
}

https://wandbox.org/permlink/9g8uhDsVHAW1rpwV

由于某些环境通常在 /usr/include 中安装了旧版本的 msgpack-c,因此在构建时可能会造成混乱。请检查包含路径中的 msgpack-c 的版本。

Packing

Pack 表示将 C++ 类型编码为 MessagePack 格式 数据。

Single value

Let’s pack the small string “compact”.
Here is an example:

#include <iostream>
#include <sstream>

#include <msgpack.hpp>

// hex_dump is not a part of msgpack-c.
inline std::ostream& hex_dump(std::ostream& o, std::string const& v) {
    std::ios::fmtflags f(o.flags());
    o << std::hex;
    for (auto c : v) {
        o << "0x" << std::setw(2) << std::setfill('0') << (static_cast<int>(c) & 0xff) << ' ';
    }
    o.flags(f);
    return o;
}

int main() {
    std::stringstream ss;
    msgpack::pack(ss, "compact");
    hex_dump(std::cout, ss.str()) << std::endl;
}

https://wandbox.org/permlink/c6oFGZWtYiGNF8f6

你得到以下打包数据:

0xa7 0x63 0x6f 0x6d 0x70 0x61 0x63 0x74
|   'c'  'o'  'm'  'p'  'a'  'c'  't'
|
7 bytes string

A7 表示后面是一个 7 字节的字符串。弦的主体紧跟在 A7 之后。有关格式规范的详细信息,请参阅 https://msgpack.org/。

这是一个字符串示例。其他类型按照此处记录的方式进行映射。

Aggregate value

Arrays

您可以按如下方式打包 std::vector:

int main() {
    std::stringstream ss;
    std::vector<int> v { 1, 5, 8, 2, 6 };
    msgpack::pack(ss, v);
    hex_dump(std::cout, ss.str()) << std::endl;
}

https://wandbox.org/permlink/ZB2aAMOgRRQ2Mzvc

Packed data:

0x95 0x01 0x05 0x08 0x02 0x06
|     1    5    8    2    6
|
5 length array

其他顺序容器可以以相同的方式包装。

Maps

您可以按如下方式打包 std::map :

int main() {
    std::stringstream ss;
    std::map<std::string, int> v { { "ABC", 5 }, { "DEFG", 2 } };
    msgpack::pack(ss, v);
    hex_dump(std::cout, ss.str()) << std::endl;
}

https://wandbox.org/permlink/4ZiGGpxYZ9eeRlBF

Packed data:

0x82 0xa3 0x41 0x42 0x43 0x05 0xa4 0x44 0x45 0x46 0x47 0x02
|    |   'A'  'B'  'C'    5   |   'D'  'E'  'F'  'G'    2
|    |                        |
|    |                        |
|    3 bytes string           4 bytes string
|
|    [    key        ] [val]  [     key            ] [val]
|    [    element 1        ]  [     element 2            ]
2 length map

其他关联容器也可以以相同方式包装。

Q.E.D.