Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to parse binary files in Clojure

What is the cleanest way to parse binary data in clojure? I need to be able to read/write equally cleanly to a file or a socket.

something like:

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

and the reverse for putting data back. It would be really great to somehow define the structure once and have the read and write functions use the same definition.

like image 505
Arthur Ulfeldt Avatar asked Apr 15 '09 00:04

Arthur Ulfeldt


2 Answers

Gloss makes it easy to define binary formats at the byte level for both reading and writing.

(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"})

The bit-map function allows bit level formats, but the number of bits defined must be divisible by 8 so the bytes still line up.

There's also byte-spec.

like image 157
James Marble Avatar answered Oct 15 '22 07:10

James Marble


Since Clojure can use native Java functions, why not use those? A quick Googling along those lines gives: http://gnuvince.wordpress.com/2009/01/29/reading-binary-data-in-clojure/

like image 4
Don Werve Avatar answered Oct 15 '22 09:10

Don Werve