Pergunta

I têm função Clojure que leva uma sequência de números de corta-lo para o número apropriado de bits e retorna uma sequência preguiçoso dos pedaços (bits de ordem mais baixa primeiro). Ele almofadas os bits de alta ordem do último bloco para preencher o tamanho do bloco e eu preciso de conselhos sobre a "melhor maneira (tm)" para registrar a quantidade de preenchimento, mantendo-o preguiçoso e funcional?

As palavras de sabedoria muito apreciado.

(defn block-seq
  ([block-size bytes]
    "reads a byte-seq into a sequence of block-size bits."
    (block-seq 8 block-size bytes))
  ([in-block-size out-block-size bytes]
    "converts a seq from in-block-size to out-block-size"
  ...

Parâmetros:

  • em bloco de tamanho é o número de bits significativos em cada número da sequência de entrada
  • a-bloco de tamanho é o número de bits significativos em cada um dos números na SEQ preguiçoso que é retornado.
  • bytes é uma sequência de números de preguiçoso que para extrair os bits

Aqui é um exemplo que leva uma sequência de três bytes e a divide em duas uma sequência de vinte números de bits (e, em seguida, imprime-lo como uma cadeia binária).

user> (map #(java.lang.Integer/toBinaryString %) (block-seq 20 [0xAA 0xAA 0xAA]))
("10101010101010101010" "1010")
user> 

O segundo número da sequência de 20 números de bits tem apenas quatro bits mais significativos e tem um eficaz 16 zeros adicionados. Se eu, em seguida, passou esta sequência para outra função que queria fazer algo com a seqüência e enviá-lo através de uma rede; o código nas necessidades fim de recepção saber não para imprimir / store / etc últimos 16 bits.

PS: estes podem ser acorrentado. (Bloco-seq 20 15 (bloco-seq 8 20 (leia-bytes-de-arquivo)))

Foi útil?

Solução

Ainda não é muito claro o que você quer fazer, mas parece que você quer saber a melhor maneira para o bloco-seq para retornar o número de bits acolchoadas no último pedaço. Claro que isso não é possível frente até se você quer ser adequadamente preguiçoso, por isso o número teria que ser devolvido com ou após o último pedaço.

Sem o uso de metadados você pode simplesmente retornar uma lista como

(1 2 3 :pad 12)

Usando metadados, você pode adicionar essa informação estofo para os últimos contras (Clojure não pode adicionar metadados para Inteiros), de modo que os últimos contras seria equivalente a

(with-meta '(3) {:pad 12})

Para encadeamento para o trabalho, binário bloco teria que estar ciente de que a informação estofamento, em ambos os casos, de modo a ser capaz de un-pad e, em seguida, re-pad o último pedaço.

Como transmitir a informação de preenchimento sobre o fio é outra questão, no entanto.

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