带有Akka-Stream的Marc21二进制解码器

时间:2017-09-06 02:53:44

标签: scala binaryfiles binary-data akka-stream decoder

我正在尝试解码Marc21二进制数据记录,该记录具有以下关于提供记录长度的字段的规范。

  

计算机生成的五个字符的数字,等于   整个记录,包括它自己和记录终止符。数字   是正确的,未使用的位置包含零。

我正在尝试使用

Akka Stream Framing.lengthField,但我不知道如何指定该字段的大小。我想一个字符是8位,可能是一个数字16,我不确定,我想知道这是否依赖于平台或语言。简而言之,问题是可以说该字段的大小知道我在Scala / Java中。

还有什么意思:

  

数字是右对齐的,未使用的位置包含零“

这是否意味着如果正确收集该值,您将如何阅读该值?

如果有人对此有所了解,请分享。

EDIT1

背景:

我正在尝试构建一个流处理图,其中第一个阶段将处理针对symphony(供应商编目系统)服务器运行的sys命令的结果,该服务器是一个非结构化字节块的流,整体代表所有请求的Marc21记录(完全转储或部分转储)。

通过处理我的意思是,将非结构化字节流分块为帧为帧的帧,其中帧是记录。

换句话说,当时准备一个记录的字节,并将其单独发送到下一个阶段。

下一阶段将包括将该记录(字节)发送到apache Kafka。

显然,排放阶段将完全并行化以加速该过程。

Symphony服务器无法在请求时流式传输转储,尤其是在网络上。因此,这个基于Akka流的Graph处理可以执行该工作,用于在我们的整个快速数据基础设施中快速摄取/生成转储和整体流处理。

EDIT2

基于@badcook输入,我想知道是否可以在这里使用ComputeFramesize。不确定我对函数有什么困惑,它对参数有什么影响。

很少有人会对此表示赞赏。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试解析MARC 21 records

在这种情况下,我建议您只看一下MARC4J并使用它。

如果要将其与Akka流集成,或者即使您想以自己的方式解析MARC记录,我建议使用MARC 21记录终止符(ASCII控制字符)使用Framing.delimiter分解字节流1D)进入完整的MARC记录,而不是尝试流和使用MARC记录的片段。它会变得容易多了。

至于您的具体问题:MARC 21规范在讨论其结构时使用字符而不是原始字节。它指定两个字符编码为原始字节,UTF-8和MARC 8,两者都是可变宽度编码。因此,并非每个字符都是一个字节。字符占用的字节数没有单一的答案。

" [R]正当且未使用的职位包含零"另一种说法是从左边用0填充数字。在这种情况下,这一行来自一个较大的引用,保持数字字​​符串必须是5个字符长。这意味着如果您尝试表示数字1,则必须将其表示为00001