我尝试从akka.stream.scaladsl.Source[ByteString, Any]
读取前16个字节,并返回[Array[Byte], Source[ByteString, Any]]
。
在阅读前16个字节之后,我想像往常一样对剩余的Source
进行流处理。
使用案例:
Source[ByteString, Any]
是一个加密的流,流中的前16个字节是初始化向量。我需要得到初始化向量才能解密流的其余部分。
这就是我所尝试的:
Source.single(ByteString("This is my test string"))
.prefixAndTail(16).runWith(Sink.head)
我想这样的东西,但是prefixAndTail
需要输入的元素数。元素数不是字节数。
如果你有什么建议,请告诉我。谢谢!
3条答案
按热度按时间bxpogfeg1#
下面的示例对您的用例做了几个假设:
Source
中的第一个ByteString
元素总是包含16字节的初始化向量(我在这里将其称为“密钥”)。第一个元素中的其余字节(即前16个字节以外的字节)可以用密钥解密。(为简单起见,本示例将前三个字节视为密钥。)String
。运行上面的命令将打印以下内容:
在本例中,我取
Source
中第一个ByteString
的前三个字节作为键,将ByteString
中剩余的三个字节作为Source
的其余部分的前缀(尾巴)、然后,变换所得到的x1M7N1x,使得密钥与每个x1M8N1x元素耦合。然后,Source
通过Flow
扁平化并解密。Flow
返回原始加密的ByteString
和包含解密值的Option[String]
。希望这至少能给您的用例带来一些灵感和想法。
raogr8fs2#
需要注意的几件事:
1.由于输入源来自网络,因此某些ByteString可能为空
1.我们需要前16个字节来正确解密流的其余部分
我将在代码中留下一些注解作为解释。
包含空ByteString的测试示例:
结果预期
abcdefghijklmnop
为前16个字节brjng4g33#
老好人 java 来救场了:
如Read First 4 Bytes of File中所述