【问题标题】:Improper deserialization of protocol message协议消息反序列化不当
【发布时间】:2017-03-23 06:11:18
【问题描述】:

我正在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;
}

解包后,无论我将什么打包到原始消息中,都会获得枚举值,始终为零。但是反序列化后文本字段值仍然正确。 比如我在打包枚举LEARN__LEARNMESSAGE__LEARN_TYPE__THREE 但解压后变成LEARN__LEARNMESSAGE__LEARN_TYPE__ZERO

我通过gcc -o program mycode.c learn.pb-c.c -lprotobuf-c编译

谁能帮我找出我正在做的错误:

#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)


}

【问题讨论】:

  • package learn; 为这个 C 程序做了什么?它在此处的适用性尚不清楚。
  • @chux 我只是在学习协议缓冲区。所以我选择了这个名字。抱歉,它不符合上下文。

标签: c serialization deserialization protocol-buffers protoc


【解决方案1】:

生成的C代码中有一个字段protobuf_c_boolean has_typ;。将其设置为 1 后,事情开始按预期工作。

所以代码实际上必须是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多