2012-04-24 9 views
1

私はjavaにいくつかのC++コードを移植しています。私の特定のインスタンスでは、データをバイト[]に書き込んでファイルに書き出します。 C++で定義されている最初の部分は、uintと3つのushortsで構成される構造体です。 2番目の部分はデータの主要部分です。出力ストリームに送る前にバイト[]の末尾に追加します。java構造体のMimic C++とbyte []への書き込み

私の質問はこれです:ヘッダーの値をbyte []に​​書き込む最も簡単な方法は何ですか?私はそこに1つの値を入れてから、特定のバイト数をオフセットし、必要に応じて繰り返すことができますが、これを行うにはこれが最善の方法ですか?

また、バイトアライメントはどのように管理しますか? C++コードは、アライメントのためにデフォルト値(4バイト?)を使用するように見えます。

おかげで、 ジェイソン

+1

まず、Javaには符号なしの型はありません。あなたはいくつかの重い冒険をしています。 –

+0

Javaの型を符号なしとして扱う方法がありますが、値を混在させないように非常に注意する必要があります。 –

+0

署名されていない値は、署名されているかのように書くことができます。通常、キャストはあなたが必要とするすべてです。 –

答えて

3

おそらく、バイトごとの出力を整理するためのJavaで最も素晴らしい方法です、それが簡単にByteBufferを使用することを見つけるかもしれません。

ByteBufferでも、C++がどのように出力を調整しているのかは分かりませんが、ピンチでは手動で進めることができます。

+1

+1:ByteBufferでエンディアンを制御することもできます。 –

0

は、あなたのコードは、あなたが頭痛のビットを持っているつもりだ符号なし整数と同様のバイト配列を解析する可能性がある場合ByteArrayOutputStream

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream() 
DataOutputStream stream = new DataOutputStream(byteArrayOutputStream); 

try { 
    stream.writeInt(i); 
    stream.writeShort(s0); 
    stream.writeShort(s1); 
    stream.writeShort(s2); 
    stream.flush(); 
} catch (IOException e) { 
    // this can't happen, but you still require a try catch block 
} 

byte[] array = byteArrayOutputStream.toByteArray(); 

をラップDataOutputStreamをを使用してください。つまり、負の数をチェックし、適切に対処する必要があります。例えば、 。

int unsignedIntAsSignedInt = inStream.readInt(); 
long realData; 
if (unsignedIntAsSignedInt < 0) { 
    realData = ((long) unsignedIntAsSignedInt) - (((long)Integer.MIN_VALUE) * 2); 
} else { 
    realData = unsignedIntAsSignedInt; 
} 
+0

私はWindowsマシンで作業していたので、これはうまくいきませんでした。私はデータを書き出すときにエンディアンをLITTLE_ENDIANに設定する必要がありました。 – Jason

関連する問題