2009-06-23 69 views
4

我有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" 
    ... 

参数:

  • 在块大小是显著比特的输入序列中的每个号码的数目
  • 出块大小是在每个显著比特数返回的lazy seq中的数字。
  • 字节是数字的懒惰序列从中提取比特

这里是利用了三个字节的序列,并且将其分解为两个20位数字(的序列的示例,并且然后打印其作为一个二进制字符串)。

 
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(read-bytes-from-file)))

+0

很难说没有看到更多的代码,你可以使用元数据来记录填充吗? – 2009-06-23 19:46:12

回答

1

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

不使用元数据,你可以直接返回像

(1 2 3 :pad 12) 

使用元数据的列表,你可以添加填充信息到最后的利弊(Clojure中不能添加元数据为整数),所以最后的利弊将相当于到

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

对于链接工作,二进制块就必须意识到这一点填补信息,在这两种情况下,以便能够取消垫,然后再垫的最后一块。

但是,如何通过电线传输填充信息是另一个问题。