clojureでバイナリデータを解析する最もクリーンな方法は何ですか?ファイルまたはソケットに対して同等にクリーンに読み取り/書き込みできる必要があります。
何かのようなもの:
(データの読み取りデータソース) => {:index 42、:block-size 4、data-size:31415、:data(1 2 3 4 ...)}
データを戻す場合はその逆です。どういうわけか構造を一度定義して、読み取り関数と書き込み関数に同じ定義を使用させるのは本当に素晴らしいことです。
clojureでバイナリデータを解析する最もクリーンな方法は何ですか?ファイルまたはソケットに対して同等にクリーンに読み取り/書き込みできる必要があります。
何かのようなもの:
(データの読み取りデータソース) => {:index 42、:block-size 4、data-size:31415、:data(1 2 3 4 ...)}
データを戻す場合はその逆です。どういうわけか構造を一度定義して、読み取り関数と書き込み関数に同じ定義を使用させるのは本当に素晴らしいことです。
Glossを使用すると、読み取りと書き込みの両方でバイトレベルでバイナリ形式を簡単に定義できます。
(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で割り切れる必要があるため、バイトは整列します。
バイト仕様もあります。
ClojureはネイティブJava関数を使用できるので、それらを使用してみませんか?これらの線に沿ってすばやくグーグルすると、次のようになります:http: //gnuvince.wordpress.com/2009/01/29/reading-binary-data-in-clojure/