2

(TCP経由で)パケットをC++プログラムに送信するJavaプログラムがあります。2種類のオブジェクト(構造体Aまたは構造体B)のみが送信されます。2つのオブジェクトをシリアル化してc++プログラムに送信する必要があります。これにより、c ++プログラム内で逆シリアル化すると、送信内容に応じて構造体Aまたは構造体Bのタイプになります。外部Javaパッケージなしでこれを達成するにはどうすればよいですか?

            struct A
            {
                unsigned int field1; 
                unsigned int field2; 
            }

            struct B
            {
                unsigned int length;
                struct A list[GLOBALLENGTH];
            }

GLOBALLENGTHは、静的でグローバルなintです。

上記のタイプを厳密に扱っているので、一般的な解決策は必要ないことに注意してください。また、私はc ++プログラム(ブラックボックスです)にアクセスできません。どちらも小さなインド語で動作します。

4

2 に答える 2

5

c ++プログラムは、32ビット整数を使用して、宣言された順序でフィールドを使用し、リトルエンディアンの順序でパディングなしで、各構造のデータの生のダンプを期待しているようです。それがすべて正しい場合、C++プログラムで使用するバイトを書き込む1つの方法は次のとおりです。

private static final int A_SIZE = 8;
private static final int B_SIZE = 4 + GLOBALLENGTH * 8;

public byte[] writeA(A a) {
    byte[] bytes = new byte[A_SIZE];
    writeA(a, bytes, 0);
    return bytes;
}

private void writeA(A a, byte[] bytes, int offset) {
    ByteBuffer buff = ByteBuffer.wrap(bytes, offset, A_SIZE);
    buff.order(ByteOrder.LITTLE_ENDIAN);
    buff.putInt(a.field1).putInt(a.field2);
}

public byte[] writeB(B b) {
    byte[] bytes = new byte[B_SIZE];
    ByteBuffer buff = ByteBuffer.wrap(bytes, 0, 4);
    buff.order(ByteOrder.LITTLE_ENDIAN);
    buff.putInt(b.length);
    int offset = 4;
    for (A a : b.list) {
        writeA(a, bytes, offset);
        offset += A_SIZE;
    }
    return bytes;
}

writeA(A)次に、適切なパブリックメソッド(または)を呼び出してwriteB(B)、バイトをサーバーに送信できます。

于 2012-11-27T02:50:54.157 に答える
1

Javaで使用されるシリアル化アルゴリズムは、Java言語に関する限り標準です。目的のために外部C/C ++ライブラリを使用しない限り、C /C++プログラム内からそのようなオブジェクトを逆シリアル化することはできません。

逆もまた真です。ある種の外部パッケージを使用しない限り、C /C++でシリアル化されたオブジェクトをJavaに逆シリアル化することはできません。

したがって、最善の策は、独自のプロトコルを考え出し、それに応じてシリアル化することです。プロトコルのJavaおよびC/C++実装を作成する必要があります。

于 2012-11-27T02:25:07.330 に答える