2017-09-06 18 views
0

레코드의 길이를 제공하는 필드와 관련하여 다음과 같은 스펙을 가진 Marc21 바이너리 데이터 레코드를 디코딩하려고합니다.Marc21 Akka-Stream 이진 디코더

A 컴퓨터 자체로 생성 된 5 자의 숫자는 전체 레코드의 길이와 같습니다 (자체 및 레코드 터미네이터 포함). 숫자 은 오른쪽 정렬되며 사용되지 않는 위치에는 0이 포함됩니다.

나는 그러나 난 그냥 그 필드의 크기를 지정하는 방법을 모른다,

Akka 스트림 Framing.lengthField를 사용하는 것을 시도하고있다. 나는 캐릭터가 8 비트, 아마 16을위한 숫자일지도 모른다고 상상한다. 플랫폼이나 언어에 의존하는지 궁금하다. 간단히 말해서, 문제는 Scala/Java에 있다는 것을 알고있는 필드의 크기가 무엇인지 말할 수 있습니다.

또한 무엇을합니까 수단 : 숫자는 오른쪽 정렬하고 사용되지 않는 위치가

제대로 수집하는 경우 하나의 값을 읽는 방법에 대한 의미를 가지고

합니까

"0을 포함하고있다

누구든지이 사실을 알고 있다면 공유하십시오.

EDIT1

상황 :

내가 구조화되지 않은 바이트 chunck의 스트림 첫 번째 단계는 교향곡 (공급 업체 카탈로그 시스템) 서버에 대해 달린 sys 명령의 결과를 처리 할 것입니다 스트림 처리 그래프를 구축을 위해 노력하고있다 전체적으로 요청 된 모든 Marc21 레코드를 나타냅니다 (전체 덤프 또는 부분 덤프).

처리한다는 것은 프레임의 스트림이 레코드 인 비정형 스트림의 스트림을 청크로 처리하는 것을 의미합니다.

즉, 한 레코드의 바이트를 준비하고 다음 스테이지로 개별적으로 방출합니다.

다음 단계는 그 레코드 (바이트)를 아파치 카프카에게 방출하는 것으로 구성됩니다.

분명히 배출 단계는 프로세스를 가속화하기 위해 완전히 병렬 처리됩니다.

Symphony 서버에는 특히 네트워크를 통해 요청시 덤프를 스트리밍 할 수있는 기능이 없습니다. 따라서이 Akka 스트림 기반의 Graph Processing은 빠른 데이터 수집에서 우리의 덤프를 신속하게 처리/생산하고 전반적인 스트리밍 처리를 수행하기 위해이 작업을 수행합니다. ComputeFramesize 여기에 사용될 수있는 경우 @badcook 입력을 기반으로

EDIT2

, 나는 궁금하다. 내가 함수에 약간 혼란스럽고 매개 변수에 무엇이 들어 있는지 확신하지 못합니다.

약간의 설명이 크게 감사하겠습니다.

+0

미래에는 이러한 종류의 질문을 2 개로 나누고 모든 정보를 포함하는 것이 좋습니다. Akka의 'Framing'에 관한 질문은 MARC 사양에 대한 (묵시적인) 질문과 완전히 다르므로 두 가지 별도의 질문에 속합니다. 또한 MARC는 질문의 중요한 부분이 아니더라도 MARC를 전혀 언급하지 않았습니다. (당신이 적어도 당신의 질문과 제목에 MARC를 기술하고 포함한다면 나의 투표를 제거 할 것입니다.) – badcook

답변

1

MARC 21 records을 구문 분석하려는 것 같습니다.

그런 경우에는 MARC4J을 살펴보고이를 사용하는 것이 좋습니다.

Akka 스트림과 통합하려는 경우 또는 MARC 레코드를 자신의 방식으로 구문 분석하려는 경우에도 MARC 21 레코드 터미네이터 (ASCII 제어 문자 1D)를 사용하여 Framing.delimiter으로 바이트 스팸을 분리하는 것이 좋습니다 MARC 레코드 조각을 스트리밍하고 작업하는 대신 MARC 레코드를 완료하십시오. 훨씬 쉬울거야.

구체적인 질문은 : MARC 21 사양은 구조에 대해 말할 때 원시 바이트가 아닌 문자를 사용합니다. 2 바이트의 문자 인코딩을 가변 바이트 인코딩 인 UTF-8 및 MARC 8로 지정합니다. 따라서 모든 문자가 바이트라는 사실이 아닙니다. 한 문자가 차지하는 바이트 수에 대한 대답은 하나도 없습니다.

"[오른쪽]에 공백이 있고 사용하지 않는 위치에 0이 포함되어 있습니다."라는 말은 숫자가 왼쪽에서 0으로 채워진다는 의미입니다. 이 경우이 줄은 숫자 문자열이 5 자 이상이어야한다는 큰 따옴표에서옵니다. 즉, 숫자 1을 나타내는 경우 00001으로 표시해야합니다.

+0

나는 처음에 frame.delimiter를 사용하려했지만 그 해결책은 전혀 작동하지 않았습니다. 그 이유는 레코드 종료자가 구분 기호가 아니고 레코드에 포함 된 것이기 때문입니다. 즉, 프레임은 레코드 종결자가없는 프레임을 반환합니다. marc4j와 같은 lib에 의해 나중에 구문 분석 할 때이 문제가 발생합니다. – MaatDeamon

+0

이전에 언급 한 바와 같이 예, 저는 marc21 레코드를 처리하려고합니다. 그러나, 나는 marc21 레코드를 읽는 것이 시작일 때 스트림 처리 체인을 만들 필요가있다. – MaatDeamon

+0

나는 이미 marc4j와 협력 중이다. – MaatDeamon