4

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

智慧之言大受赞赏。

(定义块序列
  ([块大小字节]
    “将字节序列读入块大小的位序列。”
    (块序列 8 个块大小字节))
  ([in-block-size out-block-size 字节]
    “将序列从块内大小转换为块外大小”
  ...

参数:

  • in-block-size 是输入序列中每个数字的有效位数
  • out-block-size 是返回的惰性序列中每个数字的有效位数。
  • bytes 是从中提取位的惰性数字序列

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

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

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

PS:这些可以链接。(block-seq 20 15 (block-seq 8 20 (read-bytes-from-file)))

4

1 回答 1

1

目前还不太清楚你想做什么,但似乎你想知道块序列返回最后一个块中填充位数的最佳方法。当然,如果您想适当地懒惰,这是不可能的,因此必须在最后一个块之后或之后返回该数字。

如果不使用元数据,您可以只返回一个列表,例如

(1 2 3 :pad 12)

使用元数据,您可以将该填充信息添加到最后一个缺点(Clojure 无法将元数据添加到整数),因此最后一个缺点将相当于

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

为了使链接工作,二进制块在这两种情况下都必须知道该填充信息,以便能够取消填充然后重新填充最后一个块。

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

于 2009-09-23T12:08:11.217 回答