我正在尝试解码Marc21二进制数据记录,该记录具有以下关于提供记录长度的字段的规范。
计算机生成的五个字符的数字,等于 整个记录,包括它自己和记录终止符。数字 是正确的,未使用的位置包含零。
我正在尝试使用
Akka Stream Framing.lengthField,但我不知道如何指定该字段的大小。我想一个字符是8位,可能是一个数字16,我不确定,我想知道这是否依赖于平台或语言。简而言之,问题是可以说该字段的大小知道我在Scala / Java中。
还有什么意思:
数字是右对齐的,未使用的位置包含零“
这是否意味着如果正确收集该值,您将如何阅读该值?
如果有人对此有所了解,请分享。
背景:
我正在尝试构建一个流处理图,其中第一个阶段将处理针对symphony(供应商编目系统)服务器运行的sys命令的结果,该服务器是一个非结构化字节块的流,整体代表所有请求的Marc21记录(完全转储或部分转储)。
通过处理我的意思是,将非结构化字节流分块为帧为帧的帧,其中帧是记录。
换句话说,当时准备一个记录的字节,并将其单独发送到下一个阶段。
下一阶段将包括将该记录(字节)发送到apache Kafka。
显然,排放阶段将完全并行化以加速该过程。
Symphony服务器无法在请求时流式传输转储,尤其是在网络上。因此,这个基于Akka流的Graph处理可以执行该工作,用于在我们的整个快速数据基础设施中快速摄取/生成转储和整体流处理。
基于@badcook输入,我想知道是否可以在这里使用ComputeFramesize。不确定我对函数有什么困惑,它对参数有什么影响。
很少有人会对此表示赞赏。
答案 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
。