c语言 - NanoPB 编码和解码重复的int32_t值



当我将int数组编码到消息中,然后在C#应用程序中对其进行解码时,我遇到了一个问题。当我解码int数组时,我会通过MQTT将编码的字节发送到C#。我在那里解码,我所有的价值都在那里翻倍。然后,我立即将相同的字节发送回NanoPB应用程序,在那里它也会被解码,这里所有的值都是正常的。发生了什么事?

我的原型文件:

syntax = "proto2";
message stringCallback{
required string name = 1;
required string surname = 2;
required int32 age = 3;
repeated int32 values = 4;
}

我的NanoPB编码功能:

bool IntArray_encode(pb_ostream_t *ostream, const pb_field_t *field, void* const* arg){
IntArray* arr = (IntArray*)*arg;

for(int i = 0; i < arr->count; i++){
if(!pb_encode_tag_for_field(ostream, field)){
Serial.println("Encoding failed!");
return false;
}
if(!pb_encode_svarint(ostream, arr->values[i])){
Serial.println("Encoding failed!");
return false;
}
}
return true;
}

我的NanoPB解码功能:

bool IntArray_decode(pb_istream_t *stream, const pb_field_t *field, void** arg){
IntArray* arr = (IntArray*)*arg;
int64_t number;
if(!pb_decode_svarint(stream, &number)){
Serial.println("Decoding failed!");
return false;
}
Serial.println(number);
IntArray_add(arr, (int32_t)number);
return true;
}

输出NanoPB:

Name = Testing
Surname = Purpose
Age = 23
[14 11 10 5 109 32321 23 19 15]

输出C#:

Name = Testing
Surname = Purpose
Age = 23
[28 22 20 10 218 64642 46 38 30 ]

if(!pb_encode_svarint(ostream,arr->values[i](({

pb_encode_svariant((函数适用于sint32sint64类型。

您的.proto文件指定了int32,因此您应该使用pb_encode_varint()

最新更新