문제

Java 응용 프로그램에서는 TIBCO RV 메시지를 파일로 바이트로 보관하고 있습니다.

메시지를 다시 재생할 작은 유틸리티 앱을 작성하고 있습니다. 이렇게하면 파일을 구문 분석하고 수동으로 객체를 구성하지 않고 바이트에서 tibrvmsg 객체를 만들 수 있습니다.

내가 가진 문제는 Linux 상자에 생성 된 파일을 읽고 Windows 시스템에서 앱을 실행하려고한다는 것입니다. 파일이 작성된 다른 숯으로 인해 오류가 발생합니다.

이제 내가하고 싶은 것은 각 메시지를 특정 숯 (UTF-8)에 로그인하여 재생 앱을 실행하는 플랫폼에 신경 쓰지 않도록합니다. 앱은 파일에서 미리 알고있는 파일을 읽어야합니다. 파일이 작성된 숯불로 작성되었습니다.이를 위해 java.nio 패키지를 사용하여 바이트를 한 숯으로 변환 할 계획입니다.

변환을 수행하기 위해 TIBRV 메시지 바이트가 인코딩 된 숯불을 알아야합니까? 그렇다면 어떻게 찾을 수 있습니까?

도움이 되었습니까?

해결책

당신은 불투명 데이터를 가져오고 있으며, 텍스트의 비 텍스트 부분을 벗어나지 않고 텍스트 데이터로 파일에 쓰려고 시도합니다 (또는 원시 바이트로 작성 한 다음 마치 문자를 기반으로 한 것처럼 읽으려고합니다. 그것은 거의 같은 문제입니다). 이것은 처음부터 결함이 있습니다.

불투명 데이터는 무의미한 것으로 취급되어야하며 API를 다루는 방법을 알고있는 API를 돌려주기 위해 수정없이 간단하게 저장해야합니다. 데이터를 텍스트 형식으로 저장 해야하는 경우 무손실 바이트를 텍스트로 변환하십시오. 적절한 인코딩은 Base64와 같은 것입니다. 원시 바이너리 데이터에 적용하면 문자 세트 인코딩의 의미에서 인코딩은 무손실이 아닙니다.

파일에 바이트를 저장하는 것만으로도 바이트 (문자가 아님) 메시지의 길이와 그 주제를 나타내는 고정 길이 접두사와 함께 시스템을 통해 RV 메시지를 재생하기에 충분합니다.

인코딩이 문제가되는 경우 메시지 내부의 텍스트 기반 필드와 관련하여 (앱을 설계 할 때 일반적 으로이 문제를 피하는 것이 강력하게 제안됩니다), 당신은 변환 할 원래 영수증 시간에있는 것과 동일한 문제가 있습니다. 소스 인코딩에서 원하는 인코딩 (정확히 동일한 코드 사용)에 이르기까지 이는 재생과 관련하여 문제가되지 않아야합니다.

다른 팁

이것으로 (틀림없이 다소 오래된) 메일 링리스트 메시지 해당 네트워크 프로토콜의 내부 구조에 대해서는 알려진 바가 거의 없습니다. 이것은 당신이 추구하는 일을하는 것이 매우 어려울 수 있습니다.

즉, 메시지가 네트워크에서 캡처 한 바이 이진 블록 인 경우 숯이 없어야합니다. Charsets는 텍스트 데이터를위한 것이며, 단일 문자는 여러 가지 방식으로 인코딩 될 수 있기 때문에 중요합니다. 이진 데이터는 문자로 구성되지 않으므로 그러한 의미에서 인코딩이있을 수 없습니다.

이것은 아마도 tibrv가 아닌 Java String 인코딩과 관련이있을 것입니다. 문서에는 이것이 있지만 :

Strings and Character Encodings 

--------------------------------------------------------------------------------

Rendezvous software uses strings in several roles: 

* String data inside message fields
* Field names
* Subject names (and other associated strings that are not
  strictly inside the message)
* Certified delivery correspondent names
* Group names (fault tolerance)

All these strings (both in C and in wire format) use the character
encoding appropriate to the ISO locale of the sender. For example,
the United States is locale en_US, and uses the Latin-1 character
encoding (also called ISO 8859-1); Japan is locale ja_JP, and uses
the Shift-JIS character encoding. 

When two programs exchange messages within the same locale, strings
are always correct. However, when a message sender and receiver use
different character encodings, the receiving program must convert
between encodings as needed. Rendezvous software does not convert
automatically. 

EBCDIC 
For information about string encoding in EBCDIC environments,
see tibrv_SetCodePages() . 

따라서 기계의 로케일을보고 싶을 수도 있습니다.

변환을 수행하기 위해 TIBRV 메시지 바이트가 인코딩 된 숯불을 알아야합니까?

예. 숯불은 텍스트를 바이트 스트림으로 변환하는 방법이며 그 반대도 마찬가지입니다. 네트워크 데이터는 바이트 스트림이므로 텍스트로 부분을 해석 할 때 숯을 사용하는 (암시 적 또는 명시 적으로) 질문은 문제가 올바른지 여부입니다.

한 숯으로 바이트를 변환하는 것은 기본적으로 하나의 숯을 사용하여 텍스트로 변환 한 다음 다른 것을 사용하는 바이트로 다시 변환하는 것을 의미합니다. 많은 숯이 일부 문자에 대해 1 바이트 이상을 사용하기 때문에 데이터가 변경 될 수 있습니다. 네트워크 메시지의 맥락에서, 이것은 길이 필드를 무효화하거나 텍스트 필드가 오버 플로우를 유발할 때 문제가 될 수 있습니다. 변형을하지 않고 읽기 앱에 다양한 숯을 다루는 방법을 배우도록 가르치는 것이 좋습니다.

그렇다면 어떻게 찾을 수 있습니까?

프로토콜 사양을보십시오.

입력 스트림에서 바이트 바이트 []를 모두 읽고 바이트 []를 aa fileoutputStream에 씁니다.

독자 나 작가는 관여해서는 안되며 캐릭터 개종을하고 잘못된 것입니다.

Java.io를 이해할 때까지 Java.nio를 피하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top