From 95425c88b8df424f92b5e95529ce4ae2a0d4da75 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Thu, 7 Nov 2024 11:25:32 +0300 Subject: [PATCH] =?utf8?q?=D0=A3=D1=81=D1=82=D0=B0=D0=BA=D0=B0=D0=BD=D0=B8?= =?utf8?q?=D0=BB=D1=81=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20?= =?utf8?q?=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?utf8?q?=D1=8F=20YAC?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Время от времени какие-то правки в формат кодирования этого кодека я вносил чуть ли не каждую неделю. Чем дальше, тем меньше, ибо формат более чем удовлетворителен в каждой мелочи. Вот только кодирование int-ов меня напрягало. А ведь, казалось бы, самая такая простая и базовая вещь в компьютерах, которые с числами и работают. Закодировать фиксированной длиной: может быть большой overhead. Закодировать с выбором длины (8, 16, 32, ...): тоже неплохо, но нет bigint-ов. В тэге есть много места и напрашивается возможность вшивания и длины и маленьких значений int-ов в него. И так у меня долгое время и было: длины int-ов от 1 до 16 вшивались, и значения до 32-х тоже. Не давала покоя мысль о том, что берёшь Tcl, берёшь Python -- и там везде int-ы без ограничений по умолчанию. В MessagePack bigint-ов нет. В CBOR они эмулируются через тэг добавленный к строке (тоже по сути нет). Но раз YAC заявляет, что может заменить прозрачно JSON, то значит bigint обязателен. Ввёл ещё 8 и 64-бит кодирование его длины. Вышло так, что для кодирования int-а есть аж четыре разных способа в итоге. Перебор и безумие. Хотя, да, компактно. Всё это надоело и пришёл к следующему: оставляю только bigint кодирование, сделанное в виде обычной уже существующей бинарной строки, перед которой тэг указывает что это положительный или отрицательный int. По факту -- как в CBOR, но только у меня нет тэгов, а это просто особое кодирование int-ов. Тэги CBOR ой как не все поддерживают. 0/-1 кодируются двумя байтами. До 256 -- тремя. Не так компактно как было, не так как в MessagePack или CBOR. Но схоже с ASN.1 BER. Зато экономнее всего по коду, плюс появились bigint-ы, прозрачные для использования в Tcl/Python. И вот сейчас я полностью удовлетворён кодированием. Надо только тестами уже покрыть это всё. -- 2.48.1