Escribí un código c al que hace referencia https://github.com/protobuf- c / protobuf-c / wiki / Ejemplos

Operation msg = OPERATION__INIT;
uint8_t *buf;
unsigned len;
msg.operation = "d";
msg.tracking_id = 1;
msg.x = 0.22556;
msg.y = 0.65110;
len = operation__get_packed_size(&msg);
buf = malloc(len);
operation__pack(&msg, buf);
fprintf(stderr,"Writing %d serialized bytes\n", len);

Operation *msg1 = operation__unpack(NULL, len, buf);
printf("operation:%s\n", msg1->operation);
printf("%d\n", msg1->tracking_id);
printf("%f\n", msg1->x);
printf("%f\n", msg1->y);

El resultado de la impresión es el siguiente:

Writing 3 serialized bytes
operation:d
0
0.000000
0.000000

¿Por qué tracking_id, x y y es cero? ¿Hay algún problema con mi código?

La definición de la operación está a continuación:

syntax = "proto2";

message Operation {
    required string operation = 1;
    optional int32 tracking_id = 2;
    optional double x = 3;
    optional double y = 4;
}
0
nanci 18 nov. 2019 a las 09:43

1 respuesta

La mejor respuesta

tracking_id, x y y son optional, por lo que debe especificar si se proporcionan o no.

Según la página que vinculó, debe agregar lo siguiente:

msg.has_tracking_id = 1;
msg.has_x = 1;
msg.has_y = 1;

De manera similar, el receptor debe verificar si se proporcionaron los valores.

if (msg1->has_tracking_id)
    printf("%d\n", msg1->tracking_id);
if (msg1->has_x)
    printf("%f\n", msg1->x);
if (msg1->has_y)
    printf("%f\n", msg1->y);

No olvide liberar el búfer.

amessage__free_unpacked(msg1, NULL);
1
ikegami 18 nov. 2019 a las 06:55