如何解析Clojure中的二进制文件
问题描述:
在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.
答
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"})
bit-map
函数允许位级格式,但定义的位数必须被8整除,因此字节仍然排成一行。
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.
还有字节规格。