linux rpc:用于 protobuf 编码的 Varint:不是预期值
linux rpc: Varint for protobuf encoding : not expected value
我正在使用 google 协议缓冲区库:
$protoc --version
libprotoc 2.5.0
我在网上搜索,它说一个整数的值编码由多字节组成,每个字节的第一个位,是表示编码是否应该继续到另一个字节的指示符。我的理解:
对于一个数字101(0x65),它只有1个字节,所以它的编码值仍然是0x65
对于一个数字0x6565,只要它有2个字节,并且intel使用little endian,第一个字节应该修改它的第一位为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”。这个值怎么解释?
谢谢。
你需要按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
我正在使用 google 协议缓冲区库:
$protoc --version
libprotoc 2.5.0
我在网上搜索,它说一个整数的值编码由多字节组成,每个字节的第一个位,是表示编码是否应该继续到另一个字节的指示符。我的理解:
对于一个数字101(0x65),它只有1个字节,所以它的编码值仍然是0x65 对于一个数字0x6565,只要它有2个字节,并且intel使用little endian,第一个字节应该修改它的第一位为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”。这个值怎么解释? 谢谢。
你需要按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