Question

J'ai une fonction Clojure qui prend une séquence de nombres, la découpe en un nombre de bits approprié et renvoie une séquence lente de morceaux (les bits de poids faible en premier). Il remplit les bits de poids fort du dernier bloc pour remplir la taille du bloc et j'ai besoin de conseils sur la "meilleure façon (TM)". enregistrer la quantité de remplissage tout en le gardant paresseux et fonctionnel?

Les paroles de sagesse sont très appréciées.

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

Paramètres:

  • in-block-size est le nombre de bits significatifs dans chaque nombre de la séquence d'entrée
  • out-block-size est le nombre de bits significatifs dans chacun des nombres de la séquence différée renvoyée.
  • octets est une séquence paresseuse de nombres permettant d'extraire des bits

Voici un exemple qui prend une séquence de trois octets et la scinde en une séquence de deux nombres de vingt bits (et l’imprime ensuite sous forme de chaîne binaire).

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

Le deuxième numéro de la séquence de 20 bits n’a que quatre bits significatifs et a été ajouté à 16 zéros. Si j’ai ensuite transmis cette séquence à une autre fonction qui voulait faire quelque chose avec la séquence et l’envoyer sur un réseau; le code du destinataire doit savoir qu'il ne faut pas imprimer / stocker / etc les 16 derniers bits.

PS: ceux-ci peuvent être chaînés. (block-seq 20 15 (block-seq 8 20 (lus-octets-de-fichiers)))

Était-ce utile?

La solution

Vous ne savez toujours pas ce que vous voulez faire, mais il semble que vous souhaitiez connaître le meilleur moyen pour block-seq de renvoyer le nombre de bits remplis dans le dernier bloc. Bien sûr, ce n’est pas possible à l’avance si vous voulez être paresseux. Le numéro doit donc être renvoyé avec ou après le dernier bloc.

Sans utiliser de métadonnées, vous pouvez simplement renvoyer une liste comme

(1 2 3 :pad 12)

En utilisant des métadonnées, vous pouvez ajouter ces informations de remplissage aux derniers inconvénients (Clojure ne peut pas ajouter de métadonnées à des entiers). Ainsi, les derniers inconvénients seraient équivalents à

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

Pour que l'enchaînement fonctionne, le bloc binaire doit être conscient de ces informations de remplissage, dans les deux cas, de manière à pouvoir décompresser puis re-remplir le dernier bloc.

Cependant, comment transmettre les informations de remplissage sur le réseau est une autre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top