バイナリブロック遅延シーケンスのパディング
-
06-07-2019 - |
質問
数字のシーケンスを適切なビット数に切り取り、チャンクの遅延シーケンスを返すClojure関数があります(最下位ビットが最初)。最後のブロックの上位ビットを埋めてブロックサイズを埋めます。「best way(tm)」に関するアドバイスが必要です。怠andで機能的なままでパディングの量を記録するにはどうすればよいですか
知恵の言葉は大歓迎です。
(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" ...
パラメータ:
- in-block-sizeは、入力シーケンスの各数値の有効ビット数です
- out-block-sizeは、返される遅延シーケンスの各数値の有効ビット数です。
- bytesは、ビットの抽出元となる数字の遅延シーケンスです
これは、3バイトのシーケンスを取得し、それを2つの20ビット数のシーケンスに分割する(そしてそれをバイナリ文字列として出力する)例です。
user> (map #(java.lang.Integer/toBinaryString %) (block-seq 20 [0xAA 0xAA 0xAA])) ("10101010101010101010" "1010") user>
20ビット数のシーケンスの2番目の数には、有効ビットが4つしかなく、有効な16個のゼロが追加されています。このシーケンスを別の関数に渡して、シーケンスで何かを実行し、ネットワーク経由で送信したい場合、受信側のコードは、最後の16ビットを印刷/保存などしないようにする必要があります。
PS:これらは連鎖できます。 (block-seq 20 15(block-seq 8 20(read-bytes-from-file)))
解決
何をしたいのかはまだ明確ではありませんが、block-seqが最後のチャンクのパディングされたビットの数を返す最良の方法を知りたいようです。もちろん、適切に怠zyになりたい場合は、前もって不可能なので、最後のチャンクと一緒にまたは最後のチャンクの後に数値を返す必要があります。
メタデータを使用しなくても、次のようなリストを返すことができます
(1 2 3 :pad 12)
メタデータを使用すると、パディング情報を最後の短所に追加できます(Clojureは整数にメタデータを追加できません)。したがって、最後の短所は次と同等になります
(with-meta '(3) {:pad 12})
チェーンが機能するためには、最後のチャンクのパディングを解除してから再度パディングできるように、バイナリブロックはどちらの場合もそのパディング情報を認識する必要があります。
パディング情報を有線で送信する方法は別の質問です。