Protocol Buffer nanopb 序列化字符串和解码错误 utf-8 字符

Protocol Buffer nanopb Serializing string and decoding error utf-8 character

我目前正在尝试使用 nanopb 序列化字符串并解码 python/java 中的消息。 整数我没有问题,我可以序列化和反序列化。但是当涉及到字符串时,我总是遇到同样的错误: 'utf-8' 编解码器无法解码位置 2 中的字节 0xff:'utf-8' 编解码器无法解码位置 2 中的字节 0xff:字段中的起始字节无效:

我认为可能是Python解码问题所以我修改了: with open('FileSerialized.bin', 'rb') as f:

with open('FileSerialized.bin', encode='utf-8') as f:

我尝试使用 Java 中的解析器,但它给出了同样的错误。因此,我认为问题出在我用 C 编码消息的方式上。我正在执行以下操作:

nanopb 提供 .proto 的转换后:

typedef struct _ProtoExample {
    int32_t Value1;  //this is deserialized correctly
    char Value2[6]; //here is where I have trouble
}

我尝试通过执行以下操作来填充 char 数组:

pb_ostream_t stream = pb_ostream_from_buffer( buffer, BUFFER_SIZE );
ProtoExample Message;
Message.Value1= S_generalConfig_s.EntityType;
Message.Value2[0] = 'a';

pb_encode( &stream, ProtoExample _fields, &Message);

尝试解码后,我在尝试读取 Value2 时发现错误。

ProtoExample Message;
Message.Value1= S_generalConfig_s.EntityType;
Message.Value2[0] = 'a';

初始化消息结构是个好主意。否则,如果您忘记初始化某个字段,它将包含随机数据。所以将第一行更改为:

ProtoExample Message = ProtoExample_init_default;

这里ProtoExample_init_default是nanopb生成的初始化宏,里面会包含.proto文件中定义的任何默认值。您也可以使用 ProtoExample_init_zero 来初始化为空值。

实际问题是您的字符串未终止。在 C 中,字符串必须以 '\0' 字符结尾才有效。所以你需要添加:

Message.Value2[1] = '[=12=]';

在单个字符后设置终止符。如果添加默认初始化,它会将所有字节设置为零。在那种情况下,这有点多余,但确保字符串终止通常是良好的编程习惯。