10

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.

2 Answers 2

13

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.

Sign up to request clarification or add additional context in comments.

Comments

4

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/

1 Comment

I need to both read and write these fomats though this is a good start. I also need bit level accuracy.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.