как разобрать бинарные файлы в Clojure - PullRequest
9 голосов
/ 15 апреля 2009

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 26 октября 2011

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

(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, чтобы байты все еще выстраивались в линию.

Также есть спецификация байта .

4 голосов
/ 15 апреля 2009

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

...