Pregunta

Tengo la función Clojure que toma una secuencia de números y la divide en el número apropiado de bits y devuelve una secuencia perezosa de los fragmentos (primero los bits de orden más bajo). Rellena los bits de orden superior del último bloque para completar el tamaño del bloque y necesito consejos sobre la "mejor manera (tm)". para registrar la cantidad de relleno mientras lo mantiene perezoso y funcional?

Palabras de sabiduría muy apreciadas.

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

  • in-block-size es el número de bits significativos en cada número en la secuencia de entrada
  • out-block-size es el número de bits significativos en cada uno de los números en la secuencia perezosa que se devuelve.
  • bytes es una secuencia perezosa de números de los que extraer bits

Aquí hay un ejemplo que toma una secuencia de tres bytes y la divide en una secuencia de dos números de veinte bits (y luego la imprime como una cadena binaria).

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

El segundo número en la secuencia de números de 20 bits tiene solo cuatro bits significativos y tiene 16 ceros efectivos agregados. Si luego pasé esta secuencia a otra función que quería hacer algo con la secuencia y enviarla a través de una red; el código en el extremo receptor necesita saber para no imprimir / almacenar / etc. los últimos 16 bits.

PD: estos pueden ser encadenados. (block-seq 20 15 (block-seq 8 20 (read-bytes-from-file)))

¿Fue útil?

Solución

Todavía no está del todo claro qué quiere hacer, pero parece que quiere saber la mejor manera para que block-seq devuelva el número de bits rellenados en el último fragmento. Por supuesto, eso no es posible por adelantado si quieres ser holgazán, por lo que el número debería devolverse con o después del último fragmento.

Sin usar metadatos, podría devolver una lista como

(1 2 3 :pad 12)

Usando metadatos, puede agregar esa información de relleno a los últimos inconvenientes (Clojure no puede agregar metadatos a enteros), por lo que los últimos inconvenientes serían equivalentes a

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

Para que el encadenamiento funcione, el bloque binario debería tener en cuenta esa información de relleno, en ambos casos, para poder deshacer el relleno y luego volver a rellenar el último fragmento.

Cómo transmitir la información de relleno a través del cable es otra pregunta, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top