Functional programming 填充二进制块惰性序列

Functional programming 填充二进制块惰性序列,functional-programming,binary,lisp,clojure,lazy-evaluation,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

我有一个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" ... (除块序号 ([块大小字节] “将字节seq读入块大小位序列。” (块顺序8块大小字节)) ([块大小输入块大小输出块大小字节] “将序列从块内大小转换为块外大小” ... 参数:

  • in block size是输入序列中每个数字的有效位数
  • out block size是返回的惰性序列中每个数字的有效位数
  • 字节是从中提取位的惰性数字序列
下面是一个示例,它将三个字节的序列分解为两个二十位数字的序列(然后将其打印为二进制字符串)

用户>(映射#(java.lang.Integer/toBinaryString%)(块序列20[0xAA 0xAA 0xAA])) ("10101010101010101010" "1010") 用户> 20位数字序列中的第二个数字只有四个有效位,并添加了有效的16个零。如果我将此序列传递给另一个希望对序列进行处理并通过网络发送的函数,则接收端的代码需要知道不打印/存储/等最后16位


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

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

如果不使用元数据,您只需返回如下列表

(1 2 3 :pad 12)
使用元数据,您可以将填充信息添加到最后一个cons(Clojure无法将元数据添加到整数),这样最后一个cons就相当于

(with-meta '(3) {:pad 12})
在这两种情况下,为了使链接起作用,二进制块必须知道填充信息,以便能够取消填充,然后重新填充最后一个块


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

如果看不到更多的代码,很难判断您在做什么,但是您是否可以使用元数据来记录填充?需要读取关于填充位数的信息的内容是什么,以及它读取这些信息的方便方式是什么?谢谢您的评论。will只是好奇,把这些数字转换成“二进制字符串”有什么好处对于有线协议,当你似乎可以使用网络字节顺序协议对数字进行编码时?表面上看,转换字符串/从字符串转换字符串似乎是浪费,但在深入挖掘之前,你希望更好地理解你的用例。它是一个可变大小的字。因此,它将用于读取32位的整数,而不是将其分为67位进行处理例如。
(with-meta '(3) {:pad 12})