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;
}
압축을 풀면 원본 메시지에 무엇을 포장해도 열거 형 값은 항상 0이됩니다. 그러나 deserialization 후에도 텍스트 필드 값은 올바로 유지됩니다. 예를 들어 , 내가 열거 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