数値のシーケンスを取得して適切なビット数に切り刻み、チャンクの遅延シーケンスを返すClojure関数があります(最下位ビットが最初)。それはブロックサイズを埋めるために最後のブロックの上位ビットをパディングします、そして私はそれを怠惰で機能的に保ちながらパディングの量を記録するための「最良の方法(tm)」についてのアドバイスが必要ですか?
知恵の言葉は大歓迎です。
(defn block-seq ([ブロックサイズのバイト] 「バイトシーケンスをブロックサイズのビットのシーケンスに読み込みます。」 (block-seq 8ブロックサイズバイト)) ([in-block-sizeout-block-sizeバイト] 「シーケンスをブロック内サイズからブロック外サイズに変換します」 ..。
パラメーター:
- in-block-sizeは、入力シーケンスの各数値の有効ビット数です。
- out-block-sizeは、返されるレイジーシーケンス内の各数値の有効ビット数です。
- バイトは、ビットを抽出するための数列の怠惰なシーケンスです
これは、3バイトのシーケンスを取り、それを2つの20ビット数のシーケンスに分割する(そしてそれを2進文字列として出力する)例です。
user>(map#(java.lang.Integer / toBinaryString%)(block-seq 20 [0xAA 0xAA 0xAA])) ("10101010101010101010" "1010") ユーザー>
20ビット番号のシーケンスの2番目の番号には、4つの有効ビットのみがあり、有効な16個のゼロが追加されています。次に、このシーケンスを、シーケンスで何かを実行してネットワーク経由で送信したい別の関数に渡した場合。受信側のコードは、最後の16ビットを印刷/保存などしないようにする必要があります。
PS:これらは連鎖させることができます。(block-seq 20 15(block-seq 8 20(read-bytes-from-file)))