2017-03-23 7 views
0

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) 


} 
+0

'패키지는 무엇을 배울 않습니다'이 C 프로그램합니까? 그것의 적용 가능성은 불분명하다. – chux

+0

@chux 방금 프로토콜 버퍼를 배우고 있습니다. 그래서 나는 그 이름을 선택했다. 그것이 문맥에 맞지 않는다는 것을 유감스럽게 생각합니다. – user3219492

답변

1

생성 된 C 코드에는 protobuf_c_boolean has_typ; 필드가 있습니다. 1로 설정하면 모든 일이 예상대로 시작되었습니다.

그래서 코드는 실제로이어야합니다

msg.typ = LEARN__LEARNMESSAGE__LEARN_TYPE__THREE; 
msg.has_typ = 1; 
msg.text = "again";