2016-09-21 5 views
0

매우 구체적인 요구 사항이 있습니다. java 응용 프로그램을 가지고 있는데, 여기서 바이트 배열을 int, String과 같은 Java 유형의 메시지로 변환해야합니다. 메시지의 구조는 다음과 같이 C++로 정의된다 - 내 자바 응용 프로그램에서받을 무엇바이트 배열을 Java 유형으로 변환

struct SMSMessage{ 
int id;   
std::string name;  
std::string source;  

std::string destination; 
std::string timestamp; 
int   type;  
int   status;  
std::string message;  
int   mesg_type; 
int   mesg_sub_type; }; 

는 바이트 배열입니다. wheather C++ 응용 프로그램이 proto 버퍼 또는 바이트 배열로 변환하는 다른 방법을 사용하고 있는지 잘 모르겠습니다. 그러나 바이트 단위로 배열을 구문 분석하면 값을 얻을 수 있습니다. 예를 들어 -

ByteBuffer.wrap(Arrays.copyOfRange(byteArray, 0, 4)).getInt(); 
//byteArray -- reference to the incoming byte array 
// 0, 4-- range of bytes for integer type 

이 줄 정확한 ID 값을 반환한다 (구조에 우선하여 속성 INT이다).

내 질문은 - 이 구조체의 proto를 작성하면이 메시지를 java로 구문 분석 할 수 있습니까?

자바 유형에 바이트 배열을 변환하는 다른 방법이 있나요? 당신이 직접 자바 구조로 변환 할 수 있지만 내가 그것을 추측 확실하지

+0

나는 그 해결책을 자바 5와 자바 8 – Gunwant

+0

와 함께 작동해야한다고 말한 것을 잊지이 바이트 배열은 아마도 프로토콜 버퍼가 아닌 것 같습니다. 프로토콜 버퍼로 인코딩 된 경우 첫 번째 4 바이트를 읽는 것은 거의 일치하지 않는 한 직접 첫 번째 정수 필드를 제공하지 않습니다. –

답변

1

I'am (구글 protobuf 같은 라이브러리를 사용하지 않음) 가능하지 않습니다. 또한 작동하는 경우 데이터 유형의 크기가 동일하다는 것을 확신 할 수 없습니다. C++ 응용 프로그램과 Java 응용 프로그램을 다른 아키텍처의 다른 컴퓨터에서 실행하면 크기가 다를 수 있습니다.

제 생각에 가장 좋은 옵션은 먼저 json 또는 xml 파일에 쓰고 다른 응용 프로그램에서 다시 읽는 것입니다.

이미 작성한 것처럼 원하는 경우 유형에 따라 C++ 구조체를 정렬해야합니다. 따라서 루프를 더 잘 사용할 수 있습니다. 마찬가지로, 나는 5 배 x 바이트 4 바이트와 5 번 문자열의 정수가 있습니다.

제조

+0

C++ 응용 프로그램에 대한 제어 권한이 없기 때문에 Json이나 다른 형식을 사용할 수 없습니다. google-protobuf를 사용하는 것이 가능하지 않습니까? – Gunwant

+0

Byte by By 접근법을 사용합니다. 감사 – Gunwant

0

당신은 특별히 직접 Java 유형으로 C 구조체를 매핑에 대한 몇 가지 지원을 제공 Struct 클래스를 살펴 오픈 소스 javolution 라이브러리를 사용할 수 있습니다.

문자열의 길이를 미리 알 수 없으므로 std :: string 유형을 매핑 할 때 문제가 발생합니다. 문자열의 끝을 나타내는 널 종결자를 찾을 때까지 바이트 스트림으로이 내용을 읽어야합니다.

관련 문제