填充二进制块惰性序列

时间:2009-06-23 15:51:38

标签: functional-programming binary lisp clojure lazy-evaluation

我有Clojure函数,它接受一系列数字将其切成适当的位数并返回一个懒的序列(首先是最低位)。它填充最后一个块的高位,以填充块大小,我需要建议“最佳方式(tm)”来记录填充量,同时保持它的延迟和功能?

智慧的话非常感激。

(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是返回的lazy seq中每个数字的有效位数。
  • bytes是一个从中提取位的数字的惰性序列

这是一个示例,它采用三个字节的序列并将其分解为两个二十位数的序列(然后将其打印为二进制字符串)。

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

20位数字序列中的第二个数字只有四个有效位,并且添加了有效的16个零。如果我然后将此序列传递给另一个想要对序列执行某些操作并通过网络发送的函数;接收端的代码需要知道不打印/存储/等最后16位。

PS:这些可以链接。 (block-seq 20 15(block-seq 8 20(从文件读取字节数)))

1 个答案:

答案 0 :(得分:1)

目前还不太清楚你想做什么,但似乎你想知道block-seq返回最后一个块中填充位数的最佳方法。当然,如果你想要适当懒惰,那么预先不可能,所以这个数字必须在最后一个块之后或之后返回。

如果不使用元数据,您只需返回类似

的列表即可
(1 2 3 :pad 12)

使用元数据,您可以将填充信息添加到最后的缺点(Clojure无法向整数添加元数据),因此最后的缺点将等同于

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

对于链接工作,二元块必须在两种情况下都知道填充信息,以便能够取消填充然后重新填充最后一个块。

如何通过网络传输填充信息是另一个问题。