Ich verwende Google Protokoll Puffer Bibliothek:Linux rpc: VarInt für protobuf Codierung: nicht erwarteten Wert
$protoc --version
libprotoc 2.5.0
I Internet suchen und es sagt, der Wert Codierung einer ganzen Zahl von multibytes besteht, die jeweils erste Byte Bit, ist der Indikator zu sagen, ob die Codierung zu einem anderen Byte fortgesetzt werden soll. Mein Verständnis:
Für eine Nummer 101 (0x65), hat es nur 1 Byte, so ist sein codierter Wert immer noch 0x65 Für eine Zahl 0x6565, solange es 2 Bytes hat, und Intel verwendet wenig Endian, der 1. Byte sollte seine erste Bit modifiziert 1, und damit 0x65 + 0x80 = 0xE5, so dass die ganze Zahl 2 Byte hat, und
0x65e5
das ist meine Erwartung werden soll. aber ich habe mit meinem Beispielprogramm getestet. Zuerst habe ich versucht, einen "0x65" Wert zu setzen, log7.data und "0x6565" zu log8.data gesetzt und xxl Befehl verwenden, um sie zu überprüfen
cat 7.proto
message hello
{
required int32 f1=1;
}
$cat 7.cpp
#include "7.pb.h"
#include<fstream>
using namespace std;
int main()
{
fstream f("./log7.data",ios::binary|ios::out);
hello p;
p.set_f1(0x65);
p.SerializeToOstream(&f);
return 0;
}
$cat 8.cpp
#include ".pb.h"
#include<fstream>
using namespace std;
int main()
{
fstream f("./log8.data",ios::binary|ios::out);
hello p;
p.set_f1(0x6565);
p.SerializeToOstream(&f);
return 0;
}
den Ausgang prüfen:
$protoc 7.proto --cpp_out=./
g++ 7.cpp 7.pb.cc -lprotobuf && ./a.out && xxd log7.data
00000000: 0865 .e
$protoc 8.proto --cpp_out=./
$g++ 8.cpp 8.pb.cc -lprotobuf && ./a.out && xxd log8.data
00000000: 08e5 ca01 ....
Sie können sehen, für log8.data erwarte ich, dass es "08e5 65" ist, aber es ist eigentlich "08e5 ca01". Wie erklärt man diesen Wert? Danke.