【发布时间】:2010-11-05 05:31:35
【问题描述】:
我有 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)))
【问题讨论】:
-
如果不看更多代码,很难判断你在做什么,但你可以使用元数据来记录填充吗?
-
什么需要读取有关填充位数的信息,以及读取该信息的便捷方式是什么?
-
感谢 cmets。将编辑。
-
只是好奇,当您似乎可以使用网络字节顺序协议对数字进行编码时,将这些数字转换为有线协议的“二进制字符串”有什么好处?从表面上看,与字符串之间的转换似乎很浪费,但在深入挖掘之前希望对您的用例有更好的感觉。
-
它是一个可变大小的单词。因此它将用于读取 32 位的整数,而不是以 67 位的块处理它们。
标签: functional-programming binary lisp clojure lazy-evaluation