Size: a a a

Clojure — русскоговорящее сообщество

2019 May 19

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Думаю немного изменить это, и вместо одной гигантской спеки делать кусочки.
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Т.е. сделать (s/def ::frame (s/cat ::version ::payload)) (s/def ::version byte?) (s/def ::payload (s/* byte?)), например, и в зависимости от прочитанной ::version выбирать спеку для парсинга ::payload.
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Но это всё работает только до того места, где из байта надо сделать кучу флажков, включая флажки типа "эти два бита 0".
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Надо что-то типа спеки, но для бинарных файлов.
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Я пока использовал https://github.com/smee/binary
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Просто со спекой еще не работал, вот думал и ее попробовать
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Я на него посмотрел и мне показалось, что оно недостаточно умное. Спасибо, гляну ещё раз.
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Там нет условий по-умолчанию, я нашел какое-то решение в issues. В итоге получилось нечто подобное:
(def defined-hero
 (codec/cond-codec
  :expirience? codec/byte->bool
  :expirience #(when (:expirience? %1) :int-le)
  :secondary-skills? codec/byte->bool
  :secondary-skills #(when (:secondary-skills? %1) (b/repeated secondary-skill :prefix :int-le)))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
мы на работе пытались парсить спекой, но это не так удобно. Проблема в том, что иногда ты не знаешь заранее, сколько байт читать. Например, первый байт задает размер буфера, и нужно прочитать имено столько, не больше.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Еще бывает, что если байт меньше 128, это значит, что размер размазан по нескольким семабитным байтам, и надо всеэто собрать и склеить в нормальный лонг
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Да, в спеке нет параметризации спеки контекстом разбора.
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
И не-байты неудобно.
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Я посмотрел с десяток разных языков описания бинарных данных. Часть из них сдалась и выделила специальный тип "строка/буфер/массив с прицепленной спереди длиной в N байтов/(MSB/LSB)". Часть говорит "в описании можно использовать значения, которые уже разобраны".
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Вторые при этом ещё специфицируют язык описания выражений (или говорят "C" :), чтобы можно было сказать "массив длины (Len+1)*4"
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
У меня есть ещё один пример, где спека неудобно: байт, в котором 5 битов - это флаги, а 3 бита - это enum из 6 валидных состояний (а ещё 2 состояния - невалидные).
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
@igrishaev И чем вы теперь парсите?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Дойду до компа, скину код
источник

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
@igrishaev Я имел в виду - какой-то библиотекой, или сами написали?
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
а что если Clojurescript будет в бущущем не в JS транспайлится а прямо в это Binary AST??
источник