protobuf的ParseFromString函数返回false

时间:2018-08-12 05:23:11

标签: c++ protocol-buffers

这是我的代码:

static bool hget(acl::redis_hash& redis,char *key,char *attr){

nrtprofile::RedisNewsMessage redisNewsMessage;
acl::string value;
if(redis.hget(key,attr,value)==true){
    printf("key: %s, attr: %s, value: %s\n",key,attr,value.c_str());
    if(redisNewsMessage.ParseFromString(value.c_str())) {
        printf("decoded");
    }else{
        printf("try again");
    }

    return true;
}else{
    printf("incorrect key");    
    return false;
}

}

使用redis的hget命令后,我可以正确获取值。但是我的消息没有被解码。

当我尝试使用python解码时,它工作得很好。因此编码正确完成。为什么我不能用c ++解码

2 个答案:

答案 0 :(得分:0)

从我见过的ParseFromString的函数原型中,它以string或对string的引用作为参数。它不使用从string派生的C字符串等效项作为参数。

所以代替:

if(redisNewsMessage.ParseFromString(value.c_str())) 

尝试:

if(redisNewsMessage.ParseFromString(value)) 

if(redisNewsMessage.ParseFromString(&value)) 

答案 1 :(得分:0)

提供给ParseFromString的字符串不是字符串。它是一个任意字节的数组,包括NUL。 C ++字符串可以包含任何字节,包括NUL。 C字符串不能;第一个NUL终止字符串。

因此,c_str()接口的使用是不正确的;您需要将acl::string转换为std::string,而无需使用C字符串。附带说明一下,使用C ++ API定义自己的字符串类对我来说是一个坏主意,因为它阻止了互操作性。但是可能会有一些合适的界面。