2016-09-21 10 views
0

私は非常に特別な要件があります。 私はバイト配列をint、Stringのようなjava型を持つメッセージに変換する必要がある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; }; 

Javaアプリケーションで受け取るのはバイト配列です。 私はwheather C++アプリケーションがプロトタイプのバッファーを使用しているか、バイト配列に変換するために他の方法を使用しているのか分かりません。 しかし、バイトごとに配列を解析すると、値を取得できます。例えば -

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

この行は(構造における最初のプロパティがintである)正しいID値を返します。

私の質問は - 私はこの構造のためのプロトを書く場合、私はjavaにこのメッセージを解析することができますか?

Java型にバイト配列を変換する他の方法はありますか?あなたは、直接Javaの構造に変換することができますが、私はそれがあると思いますかどうかわからない

+0

私は言及することを忘れて、ソリューションはjava 5とjava 8で動作する必要があります – Gunwant

+0

おそらくこのバイト配列はプロトコルバッファではないようですね。それがプロトコルバッファとしてエンコードされていた場合、最初の4バイトを読み取っても、おそらく偶然でない限り、最初の整数フィールドは直接渡されません。 –

答えて

1

I'am(グーグルいるProtobufのようなライブラリを使用していません)可能ではありません。また、それが動作する場合は、データ型のサイズが同じであることを確認することはできません。異なるアーキテクチャーを持つ異なるマシン上でC++アプリケーションとJavaアプリケーションを実行すると、サイズが異なる可能性があります。

私の意見では、最善の選択肢は、最初にjsonまたはxmlファイルに書き込んで、他のアプリケーションから読み込むことです。

あなたがすでに書いたようにしたいのなら、多分あなたはタイプごとにC++構造体をソートするべきです。だから、ループをうまく使うことができます。同様に、私は4バイトの整数の5倍とXバイトの5倍の文字列を持っています。

MFG

+0

私はC++アプリケーションを制御できないので、Jsonやその他の形式は使用できません。 google-protobufを使用することはできませんか? – Gunwant

+0

Byte by Byteアプローチを使用しました。ありがとう – Gunwant

0

あなたは、特に直接Java型にCの構造体をマッピングするためのいくつかのサポートを提供しStructクラスを見て、オープンソースjavolutionライブラリを使用することができます。

文字列の長さがあらかじめわかっていないため、std :: string型のマッピングに問題が発生します。文字列の終わりを示すヌルターミネータを見つけるまで、これをバイトストリームとして読み取る必要があります。

関連する問題