gpt4 book ai didi

c - 当它是 pb_callback_t 类型时如何编码字符串

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:24 25 4
gpt4 key购买 nike

我正在使用 Nanopb,其中生成的原型(prototype)文件中的字符串变量被转换为 pb_callback_t

到目前为止,我正在尝试使用来自 nanopb 的回调的测试示例;

bool encode_string(pb_ostream_t* stream, const pb_field_t* field, void* const* arg)
{
char str[14] = "Hello world!";

if (!pb_encode_tag_for_field(stream, field))
return false;

return pb_encode_string(stream, (uint8_t*)str, strlen(str));
}
int main()
{
FeatureFile featurefile = FeatureFile_init_zero;
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

featurefile.features.Id.funcs.encode = &encode_string;
}

但是在这个例子中,字符串“Hello world!”是非常硬编码的 xD,我怎样才能将字符串从 main 动态传递给该函数?

最佳答案

pb_callback_t 结构包含一个 void* arg 字段,您可以使用它通过 arg 将任何自定义数据传递给编码/解码函数> 参数。

在这种情况下你可以这样做:

int main()
{
...
featurefile.features.Id.arg = "something";
featurefile.features.Id.funcs.encode = &encode_string;
}

请注意,arg 参数是指向 void * const指针,因此您始终必须取消引用它:

bool encode_string(pb_ostream_t* stream, const pb_field_t* field, void* const* arg)
{
const char* str = (const char*)(*arg);

if (!pb_encode_tag_for_field(stream, field))
return false;

return pb_encode_string(stream, (uint8_t*)str, strlen(str));
}

请注意,您可以传递指向任何结构的指针,即您可以轻松创建一种“解析上下文”结构并将其传递,这样您就无需关心解析函数将如何使用它。

在这种情况下,它可能是这样的:

typedef struct
{
const char * something;
const char * whatever;
...
}
callback_context_t;

int main()
{
callback_context_t ctx = { .something = "something" };

// this way you always pass the same pointer type
featurefile.features.Id.arg = &ctx;
featurefile.features.Id.funcs.encode = &encode_string;
}

bool encode_string(pb_ostream_t* stream, const pb_field_t* field, void* const* arg)
{
// ...and you always cast to the same pointer type, reducing
// the chance of mistakes
callback_context_t * ctx = (callback_context_t *)(*arg);

if (!pb_encode_tag_for_field(stream, field))
return false;

return pb_encode_string(stream, (uint8_t*)ctx->something, strlen(ctx->something));
}

关于c - 当它是 pb_callback_t 类型时如何编码字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569586/

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