2017-01-11 1 views
0

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.

Antwort

1

müssen Sie durch 7-Bit-aufzuspalten und fügen ersten Bit

0x6565 => to binary 
0b110010101100101 => split by 7 bit 
0b1 1001010 1100101 => add first bit except first 
0b1 11001010 11100101 => now show in hex 
0x01cae5