播放Iteratees:将字节流重组为可变大小的块

时间:2015-01-17 05:51:43

标签: playframework stream iterate

假设我有一个枚举器[Array [Byte]]生成大小可变大小的字节数组(比如在控制器中接受POST主体)

我知道这些流实际上包含每个数据包的数据包:

  • 4个字节,表示以字节为单位表示数据包主体大小的整数
  • 该大小的数据包正文

每个数据包可以有不同的体型。

我们如何实现一个Enumeratee,它将初始流转换为字节数组流,其中每个数组都是一个数据包主体。

使用int的简化示例(首先是int表示数据包主体大小):

List(1, 2, 3), List(4, 5), List(6), List(2, 8), List(9) -> List(2) List(4, 5 ,6), List(8, 9)

1 个答案:

答案 0 :(得分:0)

尝试从HTTP Response流解析JPG标头时遇到了完全相同的问题。

首先,您需要使用Enumerator.mapConcat将流转换为字节而不是块。 然后,您必须根据第一个字节按组对字节进行分组。为此,有一个函数Enumeratee.groupedIteratee[From, To]作为参数,并重复使用它来处理From的传入流并将其转换为{{1}的流程}。

这就是我提出的:

To

当然,如果您的整数编码方式不同(我假设无符号bigEndian,但您可能有不同的情况),则需要相应地更改for comprehension的大小行。