4

数値のシーケンスを取得して適切なビット数に切り刻み、チャンクの遅延シーケンスを返す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)))

4

1 に答える 1

1

何をしたいのかはまだはっきりしていませんが、block-seqが最後のチャンクの埋め込みビット数を返すための最良の方法を知りたいようです。もちろん、適切に怠惰になりたい場合は、事前にそれを行うことはできません。そのため、最後のチャンクと一緒に、または最後のチャンクの後に番号を返す必要があります。

メタデータを使用せずに、次のようなリストを返すことができます

(1 2 3 :pad 12)

メタデータを使用すると、そのパディング情報を最後の短所に追加できます(Clojureはメタデータを整数に追加できません)。したがって、最後の短所は次のようになります。

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

チェーンが機能するためには、バイナリブロックは、どちらの場合も、最後のチャンクのパディングを解除してから再パディングできるように、そのパディング情報を認識している必要があります。

ただし、パディング情報をネットワーク経由で送信する方法は別の問題です。

于 2009-09-23T12:08:11.217 に答える