0

私は特定のIPCスタック(私の場合はLCM)を介して送信する必要があるプロジェクトに取り組んでおり、IPCに可変長構造体を提供する必要があります。私は持っています

struct pack1 {int value1; int value2;};
struct pack2 {void *data; int data_size;}; 
//data won't always point to pack1 types

pack2へのポインターがあり、シリアル化のようなものが必要なので、これをpack2ネットワーク経由で別のプロセスに送信できます。

誰もが方法を知っていますか?

4

4 に答える 4

2

LCMは可変長配列をサポートしています。リファレンスマニュアルの「配列」セクションを参照してください:http: //lcm.googlecode.com/svn-history/r401/www/reference/lcm/tutorial-lcm-language.html

void*ただし、データには、「不明な」タイプへの単なるポインタであるを介してアクセスされます。データが単なるバイトの場合、LCM定義で次のように、データをバイト配列として扱うことができます。

struct pack2 {
  int32_t data_size;
  unsigned char data[data_size};
}
于 2011-02-07T20:14:03.483 に答える
1

ポインターを含むデータ構造をシリアル化するときはいつでも、それらのポインターをポインター以外のものに変換する必要があります。1つの可能性は、それらをデータストリーム内のオフセットに変換することです。もう1つの可能性は、それらを完全に削除し、ストリーム自体の編成に依存することです。いずれにせよ、シリアル化フォーマットを非常に正確に書き留める必要があります。経験則では、誰かが、作成した仕様以外の情報なしでシリアル化を生成または消費するコードを最初から作成できる必要があります

示したデータ構造をシリアル化する1つの可能な方法は次のとおりです。

# Each row is a 32-bit unsigned value in network byte order.
| number of pairs following     |
| [0].value1                    |
| [0].value2                    |
| [1].value1                    |
| [2].value2                    |
  ...
| [N].value1                    |
| [N].value2                    |

この種のことを行う方法とそれを文書化する方法の両方の良い例は、TCPおよびIP RFC、またはPNG仕様にあります。

于 2011-02-07T20:12:26.777 に答える
0

あなたはこのようにそれを行うことができます:

struct pack2        *p;

p = (struct pack2 *) malloc( sizeof(struct pack2) + 1024 );
p->data_size = 1024;
p->data = (char *) p + sizeof(struct pack2);

唯一の注意点は、ターゲットプラットフォームがdata_sizeで元のプラットフォームのエンディアンを維持していることを確認する必要があり、structpack2が両方のプラットフォームで同じサイズであることを確認する必要があることです。

于 2011-02-07T20:11:56.430 に答える
0

構造体には任意の数のパディングバイトが含まれる可能性があることに注意してください。これは、任意の形式のデータプロトコルを作成するときに特に厄介です。sizeof()を使用する場合は、コンパイラでパディングが無効になっていることを確認する必要があります。ポータブルな方法は、構造体メンバーをメンバーごとに調べて送信することです。

于 2011-02-07T21:16:22.623 に答える