[Avg. reading time: 9 minutes]

CBOR (Concise Binary Object Representation)

CBOR is a compact binary data format designed for efficiency, speed, and low overhead. It keeps JSON’s simplicity while delivering 30–50% smaller payloads and faster serialization, making it ideal for IoT, embedded systems, and high-throughput APIs.

https://cbor.dev

Why CBOR

JSON is human-friendly but wasteful for machines.

CBOR is Binary

  • Binary encoding instead of text
  • Smaller payloads
  • Faster parsing
  • Native binary support
  • Better fit for constrained environments

Use CBOR when:

  • Bandwidth is expensive
  • Latency matters
  • Devices are constrained
  • Message rates are high

Key Features

Binary Format

  • Compact payloads
  • Lower bandwidth usage
  • Faster transmission

Self-Describing

  • Encodes type information directly
  • No external schema required to decode

Schema-Less (Schema Optional)

  • Works like JSON
  • Supports validation using CDDL (Consise Data Definition Language)

Fast Serialization & Parsing

  • No expensive string parsing
  • Lower CPU overhead

Extensible

  • Supports semantic tags for:
  • Date / Time
  • URIs
  • Application-specific meanings

Data Types & Structure

CBOR natively supports JSON-like data structures:

Primitive Types:

  • Integers (positive, negative)
  • Byte strings (bstr)
  • text strings (tstr)
  • Floating-point numbers (16,32,64 bit)
  • Booleans (true, false)
  • null, and undefined values.

Composite Types:

  • Arrays (ordered lists)
  • Maps (key-value pairs, similar to JSON objects)

Semantic Tags:

  • Optional tags to add meaning (e.g., Tag 0 for date/time strings, Tag 32 for URIs).

Example: CBOR vs. JSON

JSON Object

{
  "id": 123,
  "name": "Temperature Sensor",
  "value": 25.5,
  "active": true
}

CBOR to/from JSON

cbor.williamchong.cloud

CBOR Playground

cbor.me

CBOR Encoding (Hex Representation)

B9 0004                                 # map(4)
   62                                   # text(2)
   6964                                 # "id"
   18 7B                                # unsigned(123)
   64                                   # text(4)
   6E616D65                             # "name"
   72                                   # text(18)
   54656D70657261747572652053656E736F72 # "Temperature Sensor"
   65                                   # text(5)
   76616C7565                           # "value"
   FB 4039800000000000                  # primitive(4627870829588250624)
   66                                   # text(6)
   616374697665                         # "active"
   F5                                   # primitive(21)

Size Comparison:

  • JSON: ~70 bytes.
  • CBOR: ~45 bytes (35% smaller)
FeatureCBORJSON/XML
Payload SizeCompact binary encoding (~30-50% smaller).Verbose text-based encoding
Parsing SpeedFaster (no string parsing).Slower (text parsing required).
Data TypesRich (supports bytes, floats, tags).Limited (no native byte strings).
Schema FlexibilityOptional schemas (CDDL).Often requires external schemas.
Human ReadabilityRequires tools to decode.Easily readable.

Limitations

Human-Unreadable: Requires tools (e.g., CBOR Playground) to decode.

Schema Validation: While optional, validation requires external tools like CDDL (Concise Data Definition Language).

When to Use CBOR

  • Low-bandwidth networks (e.g., IoT over LoRaWAN or NB-IoT).

  • High-performance systems needing fast serialization.

  • Interoperability between devices and web services.

Demo Code

git clone https://github.com/gchandra10/python_cbor_examples

CBOR + MQTT = Perfect Match

CBOR is ideal for MQTT payloads

Demonstrate how cbor can be used with mqtt.

#cbor #dataformatVer 6.0.5

Last change: 2026-02-05