プロトコルバッファのシリアル化&の逆シリアル化を試しています(C language)。 下記のようにlearn.protoメッセージを作成し、メッセージを* uint8_tにパックして解凍しようとしました。プロトコルメッセージの不適切な逆シリアル化
syntax = "proto3";
package learn;
message learnmessage {
enum LearnType {
ZERO = 0;
ONE = 1;
TWO = 2;
THREE = 3;
FOUR = 4;
FIVE = 5;
SIX = 6;
}
LearnType typ = 1;
string text = 2;
}
アンパック後、元のメッセージに何をパックしても、常にenum値が取得されます。ただし、デシリアライズ後もテキストフィールドの値は適切なままです。例えば 、私は列挙型LEARN__LEARNMESSAGE__LEARN_TYPE__THREE
を梱包していますが、開梱後に、それは私が
は、誰かが私は私がやっている間違いを見つけ出す助けることはできgcc -o program mycode.c learn.pb-c.c -lprotobuf-c
でそれをコンパイルLEARN__LEARNMESSAGE__LEARN_TYPE__ZERO
に変更されます:
#include <stdio.h>
#include <stdlib.h>
#include "learn.pb-c.h"
int main()
{
Learn__Learnmessage msg = LEARN__LEARNMESSAGE__INIT, *msgCopy;
size_t len;
uint8_t *msgStr;
msg.typ = LEARN__LEARNMESSAGE__LEARN_TYPE__THREE; //corresponds to enum value 3
msg.text = "again";
len = learn__learnmessage__get_packed_size(&msg); //get the length of the uint8_t needed to pack the message
msgStr = malloc(len * sizeof(uint8_t));
learn__learnmessage__pack(&msg, msgStr); //packs the message into msgStr
msgCopy = learn__learnmessage__unpack(NULL, len, msgStr); //unpack the message into msgCopy
printf("Orginal: %d \n", msg.typ); //prints 3 (expected)
printf("Copy: %d \n", msgCopy->typ); //prints 0 (un-expected)
}
を
'パッケージは何を学ぶん;'このCプログラムのためですか?その適用性は不明である。 – chux
@chux私はプロトコルバッファーを学んでいます。だから私はその名前を選んだ。申し訳ありませんが、文脈に沿っていません。 – user3219492