0

構造体フィールド (int) を char* バッファーにシリアライズしようとしましたが、間違っていると思います。

これは、このフィールドをコピーするために使用しているものです。

memcpy(payload + offset, &packet->payload.offset, sizeof(long int));

packet->payload.offset は long int で、値 '5' (ハードコード) が含まれています。次の点に注意してください。

私が印刷した場合:printf("offset: %ld \n", packet->payload.offset); 私は得る:offset: 5

しかし、私が印刷すると: printf("offset: %ld \n",&packet->payload.offset)、私は得る:offset: 167120959

memcopy で 2 番目の引数の '&' を削除してバッファに '5' を書き込むと、セグメンテーション フォールトが発生しますが、そうしないと、代わりに 167120959 (アドレスだと思います) がバッファにコピーされます。実際の値。

ご助力ありがとうございます!私はできるだけ説明的であるように努めました。あなたが私を助けてくれることを願っています。

4

2 に答える 2

2

しかし、私が印刷すると: printf("offset: %ld \n",&packet->payload.offset)、私は得る:offset: 167120959

これは、値ではなくアドレスを出力しているためです。アドレスが必要なため、「シリアライゼーション」メソッドは問題ありません(エンディアンは別として)memcpy

'5' をバッファーに書き込むために 2 番目の引数の '&' を削除します [...] 削除しないと、実際の値の代わりに 167120959 (アドレスだと思います) がバッファーにコピーされます。 .

違う。そのアドレスからsizeof(long int)バイトをコピーします。

于 2012-05-20T18:03:39.623 に答える
0
But if I print: printf("offset: %ld \n",&packet->payload.offset), I get: offset: 167120959

それは間違っています。それ自体のpacket->payload.offset代わりにのアドレスを出力します。packet->payload.offset

Memcpy には変数のアドレスを指定する必要があります。そうしないと変更できません (C では byref パラメーターが渡されません)。したがってmemcpy()、変数のアドレスを渡しますprintf()が、それを読み取る必要があるだけなので、変数を直接渡すことができます (また、渡す必要があります)。

于 2012-05-20T18:07:23.830 に答える