Я использую 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». Как объяснить это значение? Спасибо.