4

J'ai une fonction Clojure qui prend une suite de nombres la coupe dans le nombre de bits approprié et retourne une séquence paresseuse des morceaux (les bits les plus bas d'abord). Il tamponne 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)" d'enregistrer la quantité de rembourrage tout en le gardant paresseux et fonctionnel?bourrage des séquences paresseuses du bloc binaire

Des mots de sagesse très appréciés.

 
(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:

  • en bloc de taille est le nombre de bits significatifs dans chaque numéro dans la séquence d'entrée
  • out-bloc de taille est le nombre de bits significatifs dans chacun des les nombres dans le seq paresseux qui est retourné.
  • octets est une séquence paresseux de nombres à partir de laquelle extraire les bits

Voici un exemple qui prend une séquence de trois octets et il se décompose en une séquence de deux vingt nombres de bits (et alors elle imprime comme une chaîne binaire).

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

Le deuxième nombre dans la séquence de 20 nombres de bits ne comporte que quatre bits de poids faible et a une 16 zéros ajoutés efficaces. Si j'ai ensuite passé cette séquence à une autre fonction qui voulait faire quelque chose avec la séquence et l'envoyer sur un réseau; le code sur l'extrémité de réception doit savoir ne pas imprimer/stocker/etc les 16 derniers bits.

PS: ceux-ci peuvent être enchaînés. (block-seq 20 15 (block-seq 8 20 (read-bytes-from-file)))

+0

Il est difficile de dire ce que vous faites sans voir plus de code, mais pourriez-vous utiliser des métadonnées pour enregistrer le rembourrage? –

+0

Qu'est-ce qui doit lire les informations sur le nombre de bits de remplissage et comment le lire? –

+0

merci pour les commentaires. éditera. –

Répondre

1

On ne sait toujours pas très bien ce que vous voulez faire, mais il semble que vous vouliez connaître la meilleure façon de block-seq pour renvoyer le nombre de bits rembourrés dans le dernier bloc. Bien sûr, ce n'est pas possible à l'avance si vous voulez être paresseux, donc le nombre devrait être retourné avec ou après le dernier morceau.

Sans l'aide de métadonnées, vous pouvez simplement retourner une liste comme

(1 2 3 :pad 12) 

Utilisation des métadonnées, vous pouvez ajouter que les informations de rembourrage aux derniers contre (Clojure ne peut pas ajouter des métadonnées à Entiers), de sorte que les derniers contre EQUIVAUDRAIT à

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

pour chaîner au travail, bloc binaire devrait être au courant de ces informations de remplissage, dans les deux cas, de manière à pouvoir un pad, puis re-pad le dernier morceau.

Comment transmettre les informations de remplissage sur le fil est une autre question, cependant.

Questions connexes