マイいるProtobufメッセージは、私がいるProtobufシリアライゼーション長さが異なる
test.set_input(2.3456);
test.set_output(5.4321);
test.set_info(5.0);
シリアル化されたメッセージは
00000000 09 16 fb cb ee c9 c3 02 40 11 0a 68 22 6c 78 ba |[email protected]"lx.|
00000010 15 40 19 |[email protected]|
00000013
のように見えるこれらの値を設定すると3倍
syntax = "proto3";
message TestMessage{
double input = 1;
double output = 2;
double info = 3;
}
で構成されていtest.serializeToArray
を使用している場合は
であり、goプログラムで正常にデシリアライズできませんでした同じprotobufメッセージを使用します。 C++プログラムからそれを読み取ろうとすると、私は情報として0を受け取るので、メッセージは壊れているようです。
test.serializeToOstream
を使用している場合、私はこのメッセージを受け取りました。これは、goとC++プログラムの両方で正常に逆シリアル化できます。
00000000 09 16 fb cb ee c9 c3 02 40 11 0a 68 22 6c 78 ba |[email protected]"lx.|
00000010 15 40 19 00 00 00 00 00 00 14 40 |[email protected]@|
0000001b
test.set_input(2.3456);
test.set_output(5.4321);
test.set_info(5.5678);
にシリアル化されたメッセージは、
00000000 09 16 fb cb ee c9 c3 02 40 11 0a 68 22 6c 78 ba |[email protected]"lx.|
00000010 15 40 19 da ac fa 5c 6d 45 16 40 |[email protected]\[email protected]|
0000001b
に成功し、私の行くとcppのプログラムで読み取ることができようtest.serializeToArray
とtest.serializeToOstream
表情によって生成さの両方を値を設定します。
私はここで何が欠けていますか?最初のケースでserializeToArray
が機能しないのはなぜですか?
編集: 明らかに、serializeToStringもうまくいきます。
ここ私は比較のために使用されるコード:予想通り
file_a.open(FILEPATH_A);
file_b.open(FILEPATH_B);
test.set_input(2.3456);
test.set_output(5.4321);
test.set_info(5.0);
//serializeToArray
int size = test.ByteSize();
char *buffer = (char*) malloc(size);
test.SerializeToArray(buffer, size);
file_a << buffer;
//serializeToString
std::string buf;
test.SerializeToString(&buf);
file_b << buf;
file_a.close();
file_b.close();
なぜserializeToArrayが動作しませんの?
EDIT2:
代わりfile_b << buf.data()
のfile_b << buf.data()
を使用して、データが破損しているだけでなく、なぜます?
あなたはゴーで同じ長さを持っていますが、長さが違うと何を使用していますか? – Adrian
私はcppのように同じ操作を行うと、長さが異なるcppシリアル化とは対照的に、両方のシリアル化されたメッセージの長さが同じになる – jonadev95
ええ、最初のバージョンは間違ったIMOです。それは27バイトでなければなりません。このヘックスをhttps://protogen.marcgravell.com/decodeに置くと、27バイトのバージョンで同じ番号が出てくるのを確認することができます –