MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
!!! abstract “References”
- [MessagePack website](https://msgpack.org) - [MessagePack specification](https://github.com/msgpack/msgpack/blob/master/spec.md)
The library uses the following mapping from JSON values types to MessagePack types according to the MessagePack specification:
JSON value type | value/range | MessagePack type | first byte |
---|---|---|---|
null | null | nil | 0xC0 |
boolean | true | true | 0xC3 |
boolean | false | false | 0xC2 |
number_integer | -9223372036854775808..-2147483649 | int64 | 0xD3 |
number_integer | -2147483648..-32769 | int32 | 0xD2 |
number_integer | -32768..-129 | int16 | 0xD1 |
number_integer | -128..-33 | int8 | 0xD0 |
number_integer | -32..-1 | negative fixint | 0xE0..0xFF |
number_integer | 0..127 | positive fixint | 0x00..0x7F |
number_integer | 128..255 | uint 8 | 0xCC |
number_integer | 256..65535 | uint 16 | 0xCD |
number_integer | 65536..4294967295 | uint 32 | 0xCE |
number_integer | 4294967296..18446744073709551615 | uint 64 | 0xCF |
number_unsigned | 0..127 | positive fixint | 0x00..0x7F |
number_unsigned | 128..255 | uint 8 | 0xCC |
number_unsigned | 256..65535 | uint 16 | 0xCD |
number_unsigned | 65536..4294967295 | uint 32 | 0xCE |
number_unsigned | 4294967296..18446744073709551615 | uint 64 | 0xCF |
number_float | any value representable by a float | float 32 | 0xCA |
number_float | any value NOT representable by a float | float 64 | 0xCB |
string | length: 0..31 | fixstr | 0xA0..0xBF |
string | length: 32..255 | str 8 | 0xD9 |
string | length: 256..65535 | str 16 | 0xDA |
string | length: 65536..4294967295 | str 32 | 0xDB |
array | size: 0..15 | fixarray | 0x90..0x9F |
array | size: 16..65535 | array 16 | 0xDC |
array | size: 65536..4294967295 | array 32 | 0xDD |
object | size: 0..15 | fix map | 0x80..0x8F |
object | size: 16..65535 | map 16 | 0xDE |
object | size: 65536..4294967295 | map 32 | 0xDF |
binary | size: 0..255 | bin 8 | 0xC4 |
binary | size: 256..65535 | bin 16 | 0xC5 |
binary | size: 65536..4294967295 | bin 32 | 0xC6 |
!!! success “Complete mapping”
The mapping is **complete** in the sense that any JSON value type can be converted to a MessagePack value. Any MessagePack output created by `to_msgpack` can be successfully parsed by `from_msgpack`.
!!! warning “Size constraints”
The following values can **not** be converted to a MessagePack value: - strings with more than 4294967295 bytes - byte strings with more than 4294967295 bytes - arrays with more than 4294967295 elements - objects with more than 4294967295 elements
!!! info “NaN/infinity handling”
If NaN or Infinity are stored inside a JSON number, they are serialized properly. function which serializes NaN or Infinity to `null`.
??? example
```cpp --8<-- "examples/to_msgpack.cpp" ``` Output: ```c --8<-- "examples/to_msgpack.output" ```
The library maps MessagePack types to JSON value types as follows:
MessagePack type | JSON value type | first byte |
---|---|---|
positive fixint | number_unsigned | 0x00..0x7F |
fixmap | object | 0x80..0x8F |
fixarray | array | 0x90..0x9F |
fixstr | string | 0xA0..0xBF |
nil | null | 0xC0 |
false | false | 0xC2 |
true | true | 0xC3 |
float 32 | number_float | 0xCA |
float 64 | number_float | 0xCB |
uint 8 | number_unsigned | 0xCC |
uint 16 | number_unsigned | 0xCD |
uint 32 | number_unsigned | 0xCE |
uint 64 | number_unsigned | 0xCF |
int 8 | number_integer | 0xD0 |
int 16 | number_integer | 0xD1 |
int 32 | number_integer | 0xD2 |
int 64 | number_integer | 0xD3 |
str 8 | string | 0xD9 |
str 16 | string | 0xDA |
str 32 | string | 0xDB |
array 16 | array | 0xDC |
array 32 | array | 0xDD |
map 16 | object | 0xDE |
map 32 | object | 0xDF |
bin 8 | binary | 0xC4 |
bin 16 | binary | 0xC5 |
bin 32 | binary | 0xC6 |
ext 8 | binary | 0xC7 |
ext 16 | binary | 0xC8 |
ext 32 | binary | 0xC9 |
fixext 1 | binary | 0xD4 |
fixext 2 | binary | 0xD5 |
fixext 4 | binary | 0xD6 |
fixext 8 | binary | 0xD7 |
fixext 16 | binary | 0xD8 |
negative fixint | number_integer | 0xE0-0xFF |
!!! info
Any MessagePack output created by `to_msgpack` can be successfully parsed by `from_msgpack`.
??? example
```cpp --8<-- "examples/from_msgpack.cpp" ``` Output: ```json --8<-- "examples/from_msgpack.output" ```