这是我的代码:
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 ++解码
答案 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定义自己的字符串类对我来说是一个坏主意,因为它阻止了互操作性。但是可能会有一些合适的界面。