2017-01-11 1 views
0

Я использую Google протокол библиотеку буфера с:линукс RPC: Varint для Protobuf кодирования: не ожидало значение

$protoc --version 
libprotoc 2.5.0 

Я ищу Интернет, и это говорит значение кодирование целого числа состоит из многобайтовых, что каждый байт первого бит, является индикатором, чтобы сказать, следует ли кодирование продолжить другой байт. Мое понимание:

Для числа 101 (0x65) он имеет только 1 байт, поэтому его закодированное значение остается 0x65 Для числа 0x6565, если оно имеет 2 байта, а intel использует мало endian, 1-й байт должен изменить свой первый бит, чтобы быть 1, и, таким образом, 0x65 + 0x80 = 0xe5, так что все целое будет иметь 2 байта, и должен стать

0x65e5 

Это мое ожидание. но я тестировал свою пробную программу. Сначала я попытался установить "0x65" значение log7.data, и установите "0x6565" в log8.data и использовать команду Xxl, чтобы проверить их

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; 
} 

Проверьте выход:

$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        .... 

Вы можете видеть, что для log8.data я ожидаю, что это будет «08e5 65», но это на самом деле «08e5 ca01». Как объяснить это значение? Спасибо.

ответ

1

вам нужно разделить на 7 бит и добавьте первый бит

0x6565 => to binary 
0b110010101100101 => split by 7 bit 
0b1 1001010 1100101 => add first bit except first 
0b1 11001010 11100101 => now show in hex 
0x01cae5 
Смежные вопросы