enchimento binário de bloco sequências preguiçoso
-
06-07-2019 - |
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)))
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.