1

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

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

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

ありがとう、ジェイソン

4

2 に答える 2

3

の方が使いやすいかもしれませんがByteBuffer、これはおそらく Java でバイト単位の出力を編成する最も優れた方法です。

ByteBufferただし、アラインメントを直接気にする必要はありません。また、C++ が出力をどのようにアラインメントしているかはわかりませんが、ピンチの場合は、手動で進めることができます。

于 2012-04-24T16:09:25.383 に答える
0

ByteArrayOutputStream をラップする DataOutputStream を使用する

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();

コードが符号なし整数を含む同様のバイト配列を解析している可能性がある場合は、少し頭痛の種になるでしょう。つまり、負の数をチェックして適切に処理する必要があります。例えば。

int unsignedIntAsSignedInt = inStream.readInt();
long realData;
if (unsignedIntAsSignedInt < 0) {
    realData = ((long) unsignedIntAsSignedInt) - (((long)Integer.MIN_VALUE) * 2);
} else {
    realData = unsignedIntAsSignedInt;
}
于 2012-04-24T16:27:00.300 に答える