Domanda

Ho la funzione Clojure che accetta una sequenza di numeri che la taglia nel numero appropriato di bit e restituisce una sequenza pigra dei blocchi (prima i bit di ordine più basso). Riempie i bit di ordine superiore dell'ultimo blocco per compilare la dimensione del blocco e ho bisogno di consigli sul "miglior modo (tm)" registrare la quantità di imbottitura mantenendola pigra e funzionale?

Parole di saggezza molto apprezzate.

(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"
  ...

Parametri:

  • in-block-size è il numero di bit significativi in ??ciascun numero nella sequenza di input
  • out-block-size è il numero di bit significativi in ??ciascuno dei numeri nel seq pigro che viene restituito.
  • byte è una sequenza pigra di numeri da cui estrarre i bit

Ecco un esempio che prende una sequenza di tre byte e la suddivide in una sequenza di due numeri a venti bit (e quindi la stampa come una stringa binaria).

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

Il secondo numero nella sequenza di numeri a 20 bit ha solo quattro bit significativi e ha aggiunto 16 zeri effettivi. Se poi passassi questa sequenza a un'altra funzione che voleva fare qualcosa con la sequenza e inviarla su una rete; il codice sull'estremità ricevente deve sapere di non stampare / archiviare / etc gli ultimi 16 bit.

PS: possono essere concatenati. (block-seq 20 15 (block-seq 8 20 (read-by-from-file)))

È stato utile?

Soluzione

Non è ancora chiaro cosa vuoi fare, ma sembra che tu voglia conoscere il modo migliore per block-seq di restituire il numero di bit imbottiti nell'ultimo blocco. Ovviamente questo non è possibile in anticipo se si desidera essere adeguatamente pigri, quindi il numero dovrebbe essere restituito con o dopo l'ultimo blocco.

Senza usare i metadati potresti semplicemente restituire un elenco come

(1 2 3 :pad 12)

Usando i metadati, puoi aggiungere le informazioni di riempimento agli ultimi contro (Clojure non può aggiungere metadati agli Integer), quindi gli ultimi contro sarebbero equivalenti a

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

Affinché il concatenamento funzioni, il blocco binario dovrebbe essere a conoscenza di tali informazioni di riempimento, in entrambi i casi, in modo da poter sbloccare e ricollegare l'ultimo blocco.

Tuttavia, come trasmettere le informazioni di imbottitura sul filo è un'altra domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top