Integer
MessagePack integer formats cover the full signed/unsigned 64-bit integer range. Small positive integers (0-127) encode in a single byte (positive fixint). Small negative integers (-32 to -1) also encode in a single byte (negative fixint). Larger values use uint8/uint16/uint32/uint64 or int8/int16/int32/int64 formats.
Description
MessagePack's integer encoding is its most compact feature. The positive fixint format stores integers 0-127 in a single byte with no prefix – the byte value IS the integer. This means the most common small positive integers cost only 1 byte total.
The negative fixint format uses bytes 0xe0-0xff (the high 3 bits are 111) to encode integers -32 to -1 in a single byte.
For larger values, prefix bytes indicate the type: 0xcc = uint8 (1-byte unsigned follows) 0xcd = uint16 (2-byte big-endian unsigned) 0xce = uint32 (4-byte big-endian unsigned) 0xcf = uint64 (8-byte big-endian unsigned) 0xd0 = int8 (1-byte signed two's complement) 0xd1 = int16 (2-byte big-endian signed) 0xd2 = int32 (4-byte big-endian signed) 0xd3 = int64 (8-byte big-endian signed)
Format Variants
| Name | First Byte | Range | Description |
|---|---|---|---|
| positive fixint | 0x00-0x7f | 0 to 127 | Value is the byte itself. No prefix. Single byte. |
| negative fixint | 0xe0-0xff | -32 to -1 | High 3 bits = 111. Value = byte - 256. |
| uint 8 | 0xcc | 0 to 255 | 1 prefix byte + 1 data byte. |
| uint 16 | 0xcd | 0 to 65535 | 1 prefix byte + 2 data bytes (big-endian). |
| uint 32 | 0xce | 0 to 2^32-1 | 1 prefix byte + 4 data bytes (big-endian). |
| uint 64 | 0xcf | 0 to 2^64-1 | 1 prefix byte + 8 data bytes (big-endian). |
| int 8 | 0xd0 | -128 to 127 | 1 prefix byte + 1 signed byte. |
| int 16 | 0xd1 | -32768 to 32767 | 1 prefix byte + 2 signed bytes (big-endian). |
| int 32 | 0xd2 | -2^31 to 2^31-1 | 1 prefix byte + 4 signed bytes (big-endian). |
| int 64 | 0xd3 | -2^63 to 2^63-1 | 1 prefix byte + 8 signed bytes (big-endian). |
Examples
| Label | Hex | Value |
|---|---|---|
| 0 | 00 | positive fixint 0 |
| 127 | 7f | positive fixint 127 (max direct) |
| 128 | cc 80 | uint8 128 |
| -1 | ff | negative fixint -1 |
| -32 | e0 | negative fixint -32 (min direct) |
| -33 | d0 df | int8 -33 |
| 256 | cd 01 00 | uint16 256 |