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.
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.
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With