Pergunta

O que é a forma mais limpa para analisar dados binários em Clojure? Eu preciso ser capaz de ler / escrever igualmente limpa para um arquivo ou um soquete.

algo como:

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

eo inverso para colocar dados de volta. Seria realmente grande de alguma forma definir a estrutura uma vez e ter as funções de leitura e gravação usar a mesma definição.

Foi útil?

Solução

Gloss torna mais fácil para definir formatos binários no nível de byte para ler e escrita.

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

A função bit-map permite formatos de nível de bits, mas o número de bits definidos deve ser divisível por 8, de modo a ainda bytes alinhar.

Há também byte-spec .

Outras dicas

Desde Clojure pode usar funções Java nativos, por que não usá-los? Um pesquisando rápida ao longo daquelas linhas dá: http: / /gnuvince.wordpress.com/2009/01/29/reading-binary-data-in-clojure/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top