現在、C で記述されたプロジェクトで msgpack を使用しようとしています。構造体の内容をシリアル化する目的で msgpack を使用しています。これは、ネットワーク経由で送信され、対応する構造体に逆シリアル化されます。向こう側。
私がやろうとしていることの要約版:
#include <stdio.h>
#include <msgpack.h>
#include <stdbool.h>
typedef someStruct{
uint32_t a;
uint32_t b;
float c;
} someStruct;
int main (void){
someStruct data;
/* ... Fill 'data' with some data for test purposes ...*/
msgpack_sbuffer* buff = msgpack_sbuffer_new();
msgpack_packer* pck = msgpack_packer_new(buff, msgpack_sbuffer_write);
someStruct* structs = malloc(sizeof(someStruct) * 10);
/* ... Fill 'structs' with members containing test data ... */
// Serialize
msgpack_pack_array (pck, 10);
int i;
for(i = 0 ; i < 10 ; i++){
msgpack_pack_array (pck, 3);
msgpack_pack_uint32 (pck, structs[i].a);
msgpack_pack_uint32 (pck, structs[i].b);
msgpack_pack_float (pck, structs[i].c);
}
free(structs);
msgpack_packer_free(pck);
// Deserialize
msgpack_unpacked msg;
msgpack_unpacked_init(&msg);
bool deserialize_success = msgpack_unpack_next
(&msg, buff->data, buff->size, NULL);
if(!deserialize_success) /* Error */
msgpack_object obj = msg.data;
msgpack_object_print(stdout,obj); // This seems to work perfectly, indicating serialize / deserialize works as intended...
someStruct deserialized_data;
/* Insert code to extract and cast deserialized data to 'deserialized_data */
// Clean
msgpack_sbuffer_free(buff);
msgpack_packer_free(pck);
return 0;
}
リストされているコードは、多かれ少なかれここから直接切り取られたものであり、msgpack-c の非常に数少ないリソースの 1 つと思われます。
ワイヤーの反対側で元の構造体を「再作成」する方法について、誰かが私を正しい方向に向けることができますか? デシリアライズされたデータを実際に利用する唯一の方法は、msgpack_object_print() 呼び出しを使用して messagepack_object から出力することです。ただし、これは機能しているように見えるので、データがそこにあると確信しています。
シリアル化されたデータを何らかの方法でループし、オフセットを指定して msgpack_unpack_next() を使用して、someStruct の各メンバーを取得する必要がありますか? memcpy をローカル バイト バッファに使用しますか?
どんな助けでも大歓迎です!