CBOR (Concise Binary Object Representation) представляет данные в компактном бинарном формате. CBOR разделяет типы данных на основные и использует первые три бита первого байта для обозначения типа данных. Вот краткий обзор типов данных CBOR и их кодирования:


Основные типы данных в CBOR

Тип данныхДополнительная информацияНачальный байт (биты)Описание
Unsigned IntegerБеззнаковое целое число0b000 (0x00–0x17)Значения от 0 до 23 кодируются прямо в байте. Большие значения используют дополнительные байты.
Negative IntegerОтрицательное целое число0b001 (0x20–0x37)Значение кодируется как -(n + 1), где n — значение. Аналогично, большие числа требуют дополнительных байтов.
Byte StringПоследовательность байтов0b010 (0x40–0x57)Указывает длину строки, за которой идут сами байты.
Text StringПоследовательность UTF-8 символов0b011 (0x60–0x77)Аналогично строке байтов, но содержит текстовые символы.
ArrayПоследовательность элементов0b100 (0x80–0x97)Указывает количество элементов в массиве.
Map (Dictionary)Набор пар ключ-значение0b101 (0xA0–0xB7)Указывает количество пар ключ-значение.
Semantic TagТег для семантической аннотации0b110 (0xC0–0xD7)Указывает семантику данных (например, формат даты/времени).
Simple Value/FloatПростое значение или число с плавающей точкой0b111 (0xE0–0xFF)Прочие значения, включая логические (true, false), null, undefined, и числа с плавающей точкой.

Подробное кодирование основных типов

1. Unsigned Integer

2. Negative Integer

3. Byte String

4. Text String

5. Array

6. Map (Dictionary)

7. Semantic Tag

8. Simple Value / Float


Пример: CBOR для JSON {"key": true, "value": 42}

  1. Map с двумя парами → 0xA2.
  2. Ключ "key" → текстовая строка длиной 3 → 0x63 + 6B6579 (ASCII).
  3. Значение true → простое значение → 0xF5.
  4. Ключ "value" → текстовая строка длиной 5 → 0x65 + 76616C7565 (ASCII).
  5. Значение 42 → беззнаковое число → 0x18 + 2A.

Итоговая последовательность байтов:

A2 63 6B 65 79 F5 65 76 61 6C 75 65 18 2A

Пример CBOR (в виде последовательности байтов)
A2 # Map с двумя парами 64 # Ключ "text" (строка длиной 4) 74657874 # Значение "text" в ASCII 63 # Значение "txt" (строка длиной 3) 747874 # Значение "txt" в ASCII 66 # Ключ "nested" (строка длиной 6) 6E6573746564 # Значение "nested" в ASCII A1 # Map с одной парой (вложенный объект) 63 # Ключ "val" (строка длиной 3) 76616C # Значение "val" в ASCII 02 # Значение 2