【问题标题】:padding binary-block lazy sequences填充二进制块惰性序列
【发布时间】: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


【解决方案1】:

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

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

(1 2 3 :pad 12)

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多