Muss ich Längeninformationen mit Protobuf speichern?
Ich speichere Protobufs in einem nichtflüchtigen Speicher, um Konfigurationsinformationen zu speichern. Ich benutze NanoPB, um sie zu dekodieren / kodieren. Da ich nicht weiß, wie groß die codierten Protobufs sind, greife ich beim Abrufen eines serialisierten Protos aus dem Speicher und beim Decodieren nur die maximale Anzahl von Bytes, die der codierte Protobuf haben könnte, selbst wenn er weniger Bytes benötigt.
Meine Frage ist: Muss ich einige Daten speichern, die beschreiben, wie viele Bytes der Protobuf enthält, damit ich richtig dekodieren kann?
Oder gibt es eine Möglichkeit für mich, dies selbst zu bestimmen, wenn ich den serialisierten Puffer mit 0 auffülle oder eine andere Methode verwende. Derzeit kann NanoPB die von mir angegebenen Bytes nicht dekodieren, höchstwahrscheinlich, weil nach dem Ende des codierten Protos einige Mülldaten vorliegen und ich nicht sagen kann, wie lang die serialisierten Daten sind.
Antworten
Ja, das Ende von Protobuf-Nachrichten muss irgendwie angegeben werden, da das Format nicht selbstabgrenzend ist.
Nanopb bietet hierfür zwei integrierte Methoden:
pb_encode_nullterminated()undpb_decode_nullterminated(), die ein0x00Byte an die codierten Daten anhängen und es beim Decodieren erkennen. Dies ist eine gute Möglichkeit, wird jedoch in anderen Protobuf-Bibliotheken nicht allgemein unterstützt. Daher ist es meistens nützlich, wenn Nanopb sowohl zum Codieren als auch zum Decodieren verwendet wird.pb_encode_delimited()undpb_decode_delimited(), die die Größe vor der Nachricht voranstellen. Dies wird auch von mehreren anderen Protobuf-Bibliotheken unterstützt. Ein Nachteil ist, dass der Codierer zuerst die Länge der Nachricht bestimmen muss, bevor er sie codiert, was derzeit einen kleinen Leistungsverlust in Nanopb zur Folge hat.
Sie können auch benutzerdefinierte Methoden verwenden, z. B. das Speichern der Nachrichtenlänge an einem separaten Speicherort.