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=]';
在单个字符后设置终止符。如果添加默认初始化,它会将所有字节设置为零。在那种情况下,这有点多余,但确保字符串终止通常是良好的编程习惯。
我目前正在尝试使用 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=]';
在单个字符后设置终止符。如果添加默认初始化,它会将所有字节设置为零。在那种情况下,这有点多余,但确保字符串终止通常是良好的编程习惯。