Вопрос

Каков самый чистый способ анализа двоичных данных в Clojure?Мне нужно иметь возможность одинаково чисто читать/записывать в файл или сокет.

что-то вроде:

  (read-data source-of-data) 
  => { :index 42 , :block-size 4 , data-size: 31415, :data (1 2 3 4 ...)}

и наоборот для возврата данных.Было бы здорово каким-то образом определить структуру один раз, чтобы функции чтения и записи использовали одно и то же определение.

Это было полезно?

Решение

Блеск позволяет легко определять двоичные форматы на уровне байтов как для чтения, так и для записи.

(defcodec example-codec
  [:id       :uint32
   :msg-type (enum :byte {:a \A, :b \B})
   :status   (string :ascii :length 11)])

(def buffer (byte-array 16))

(.read (input-stream "filename.bin") buffer)
(decode example-codec buffer)

(encode example-codec {:id 42, :msg-type :a, :status "A-OKAY"})

А bit-map функция допускает форматы на уровне битов, но количество определяемых бит должно быть кратно 8, чтобы байты по-прежнему выстраивались в линию.

Есть также байтовая спецификация.

Другие советы

Поскольку Clojure может использовать собственные функции Java, почему бы не использовать их?Быстрый поиск в Google по этим строкам дает: http://gnuvince.wordpress.com/2009/01/29/reading-binary-data-in-clojure/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top