gpt4 book ai didi

c - 如何在 cJSON 和 protobuf 字节变量之间进行转换

转载 作者:行者123 更新时间:2023-11-30 16:15:31 26 4
gpt4 key购买 nike

我正在使用 protobuf-c 库和 cJSON,并且我有带有字段的 protobuf 消息 字节参数= 1;//命令特定的负载

我正在将 cJSON 解析为 protobuf,如下所示:

args = cJSON_GetObjectItemCaseSensitive(command, "args");
if (args) {
cJSON_ArrayForEach(arg, args) {
key = arg->string;
log_debug("PARSER: key = %s", key);
if (key != NULL) {
if (cJSON_IsNumber(arg)) {
log_info("received argument: %s : (int)%d : (double)%.2f",
key, arg->valueint, arg->valuedouble);
} else if (cJSON_IsString(arg) && (arg->valuestring != NULL)) {
log_info("received argument: %s : %s", key,
arg->valuestring);
} else {
log_error("error while parsing argument's value");
}
} else {
log_error("error while parsing argument");
}
}
log_debug("PARSER: print = %s", args);
// not sure if it is proper way of adding cJSON object to protobuf's bytes variable
req->args.data = cJSON_Print(args);
req->args.len = strlen(req->args.data);

然后我尝试将其解析回 cJSON 并添加到正确的消息格式:

char rpt_char[MAX_RPT_SIZE];
strncpy(rpt_char, (char*)cvp->args.data, cvp->args.len);
cJSON_AddItemToObject(json_message, "rpt", rpt = cJSON_CreateObject());
cJSON_AddStringToObject(rpt, "args", rpt_char);

我需要将消息从 cJSON 解析到 protobuf,然后解析回 cJSON。最终的 JSON 应如下所示:

{
...
rpt: {
arg1: data, // don't know actual names of key strings and values
arg2: data
},
...
}

但我得到的是:

{
...
"rpt": {
"args": "{\n\t\"arg1\":\t38,\n\t\"arg2\":\t\"Taylor Norman\"\n}[\u0002\u00106[\u0002\u0010�[\u0002\u0010�[\u0002\u0010�ȍ\u0003\u0001�[\u0002\u0010�ȍ\u0006"
},
...
}

编辑。由某个随机生成器生成的示例消息:

{"cmd":0,"t":963205,"xi":"5d2c8cb34888fc8471991545","args":{"arg1":38,"arg2":"Taylor Norman"},"kid":"5d2c8cb3329f9599e4730b6a","sig":"5d2c8cb33949d35fb22d0cb3"}

最佳答案

我已经为这个任务苦苦挣扎了大约两天,当我发布这个主题时,我的头顶上出现了一个灯泡......

所以我稍微改变了从 json 到 protobuf 的转换:

json = cJSON_PrintUnformatted(args);
req->args.data = json;
req->args.len = strlen(json);

然后我从 json->protobuf 到 protobuf->json 做了类似的东西:

    args = cJSON_Parse((char*)cvp->args.data);
cJSON_AddItemToObject(json_message, "rpt", args);

if (args) {
cJSON_ArrayForEach(arg, args) {
key = arg->string;
log_debug("PARSER: key = %s", key);
if (key != NULL) {
if (cJSON_IsNumber(arg)) {
log_info("received argument: %s : (int)%d : (double)%.2f",
key, arg->valueint, arg->valuedouble);
cJSON_AddItemToObject(rpt, key, arg->valueint);
} else if (cJSON_IsString(arg) && (arg->valuestring != NULL)) {
log_info("received argument: %s : %s", key,
arg->valuestring);
cJSON_AddItemToObject(rpt, key, arg->valuestring);
} else {
log_error("error while parsing argument's value");
}
} else {
log_error("error while parsing argument");
}
}
}

基本上,我忘记了 cJSON_Parse() 函数的存在......

关于c - 如何在 cJSON 和 protobuf 字节变量之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57071654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com