linux rpc:protobuf编码的变量:不是预期值

linux rpc:protobuf编码的变量:不是预期值,linux,encoding,protocol-buffers,Linux,Encoding,Protocol Buffers,我正在使用google协议缓冲库,其中包括: $protoc --version libprotoc 2.5.0 我在互联网上搜索,它说整数的值编码由多个字节组成,每个字节的第一位表示编码是否应该继续到另一个字节。我的理解是: 对于数字101 0x65,它只有1个字节,因此其编码值仍然是0x65 对于数字0x6565,只要它有2个字节,并且intel使用little endian,则第一个字节应将其第一位修改为1,因此0x65+0x80=0xe5,因此整个整数将有2个字节,并且应为 0x65e

我正在使用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;
}
你可以看到,对于log8.data,我希望它是08E565,但实际上是08E5CA01。如何解释这个值?
谢谢。

您需要按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
0x6565 => to binary
0b110010101100101 => split by 7 bit
0b1 1001010 1100101 => add first bit except first
0b1 11001010 11100101 => now show in hex
0x01cae5