当前位置:首页 » 操作系统 » protobuflinux

protobuflinux

发布时间: 2022-08-30 16:22:45

㈠ 如何交叉编译Python到ARMlinux平台 / 蓝讯

步骤一:部署protoc.exe
1)sudo su ---进入管理模式
//以下操作切换至protobuf文件夹
2)。/configure
3)make
4)make check
5)make install
此时可以查看protobuf文件夹下面的makefile文件,可以查看-build表示的本机环境以及-host表示的编译库的运行环境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(这两个参数在后续配置脚本需要用到,与后面脚步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0后缀“arm-apple-darwin12.3.0”保持一致)
6)make distclean清理已生成的makefile,为交叉编译配置新makefile做准备

㈡ 怎样 更新 protobuf linux ubuntu

解压
(3) cd protobuf-2.6.1
(4) ./configure
(5)
make
make check
make install

(6) 添加到lib
vim ~/.profile

打开配置文件,在该文件中添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后保存退出,接下来执行

source ~/.profile

(7) 测试是否安装成功
protoc --version

㈢ protobuf 怎么查看版本

protobuf版本需要在protobuf程序中查看。

在protobuf程序中查看版本步骤如下所示:

1、点击打开计算机,进入分区列表。


㈣ 如何搭建protobuf-c编译环境

linux 安装的时候一般自动安装gcc 的工具 没有的话 在你yum 源配置真确的话 用yum install gcc 安装gcc工具 VI 一个脚本 编辑好后 用gcc 文件名 -o 输出的文件名 进行c或c++的编译 然后就可以运行脚本了

㈤ linux protocol 2 是什么意思

下面描述了在 GNU/Linux x86_64(centeros)下安装 protocol buffer,支持 C 和 C++ 。
1. google protocol buffer 下载
下载 google protocol buffer,使用版本 2.5的,主页
http://code.google.com/p/protobuf/
下载地址:
http://code.google.com/p/protobuf/downloads/detail?name=protobuf-2.5.0.tar.gz&can=2&q=
2. protocol buffer C 下载
使用最新的,并有维护的 0.16 版本
下载主页
http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns
下载地址
http://code.google.com/p/protobuf-c/
下面地址是有维护的 0.16 版本
https://github.com/protobuf-c/protobuf-c
3. 安装 google protocol buffer
一般文件名称是 protobuf-2.5.0.tar
执行命令解压
tar -xvzf protobuf-2.5.0.tar
得到目录 protobuf-2.5.0,下面是我的工作目录结构,pb 目录是全部有关 protocol buffer 的支持
/home/huanghui/pb/protobuf-2.5.0
执行 configure,构造 makefile 文件
./configure --help
看看携带那些参数,我们指定下面的参数,编译为32 位版本
./configure --prefix=/usr/local/ CFLAGS=-m32 CXXFLAGS=-m32
执行 make,编译完成
执行 make install,编译完成后安装完成
4. 安装 protobuf-c
如果下载的是 protobuf-c-master.zip,windows 上解压后拷贝到 linux 上。
同样建立 /home/huanghui/pb/protobuf-c-master目录
因为 protobuf 有些用于 C++ 支持 google rpc 和测试的功能,我们不编译
也不安装它,所有我们这次修改一下 Makefile.am 文件。
统一给 AM_CPPFLAGS 加上 -m32 参数,编译为 32 位的程序;
统一给 AM_CFLAGS 加上 -m32 参数;
统一给 AM_LDFLAGS 加上 -m32 -L/usr/local/lib/ 参数,指定链接库;
注释掉有关 t/generated-code2 目录的所有文件,不参与编译和安装;
执行 configure,构造 makefile 文件
./configure --help
看看携带那些参数,我们指定下面的参数,编译为32 位版本
./configure --prefix=/usr/local/ CFLAGS=-m32 CXXFLAGS=-m32 protobuf_CFLAGS=-I/usr/local/include/ protobuf_LIBS=-L/usr/local/lib/

./configure --prefix=/usr/local/protocol-c-1.0-m32 CFLAGS=-m32 CPPFLAGS=-m32 CXXFLAGS=-m32 --datadir=/usr/local/protocol-c-1.0-m32/datadir protobuf_CFLAGS=-I/usr/local/protocol-2.5-m32/include protobuf_LIBS=-L/usr/local/protocol-2.5-m32/lib PROTOC=/usr/local/protocol-2.5-m32/bin/protoc LDFLAGS=-L/usr/local/protocol-2.5-m32/lib LIBS=-lprotobuf
使用这个语句配置,可以不修改配置文件了。

执行 make,编译完成
执行 make install,编译完成后安装完成
5. 测试 protobuf-c
进入 /home/huanghui/pb/protobuf-c-master/t(相对路径t)
执行命令,根据协议描述文件,生成协议源代码
/usr/local/bin/protoc-c test.proto --c_out=./
或者(根据工具protoc-c目录来)

/usr/local/protocol-c-1.0-m32/bin/protoc-c test.proto --c_out=./

静态链接 libprotobuf-c.a
gcc -m32 generated-code/test-generated-code.c test.pb-c.c -I../ -o test /usr/local/lib/libprotobuf-c.a
运行 test,输出 test succeeded.OK
./test
动态链接 protobuf-c
gcc -m32 generated-code/test-generated-code.c test.pb-c.c -I../ -o test -L/usr/local/lib/ -lprotobuf-c
6. 查询 test-generated-code.c
/home/huanghui/pb/protobuf-c-master/t/generated-code/test-generated-code.c
通过看这个代码,我们大致能明白 C 使用 protocol buffer 的流程。

7. test-generated-code2.c,验证平台是否完整支持功能
构造测试文件 test-full.pb-c.c
/usr/local/protocol-c-1.0-m32/bin/protoc-c test-full.proto --c_out=./
gcc -m32 test-generated-code2.c ../test-full.pb-c.c -I../ -I../../ -I/usr/local/protocol-c-1.0-m32/include/ -I/usr/local/protocol-2.5-m32/include/ -o test -L/usr/local/protocol-c-1.0-m32/lib/ -lprotobuf-c
./test

8. cxx-generate-packed-data.cc,验证平台是否完整支持功能
export LD_LIBRARY_PATH="/usr/local/protocol-2.5-m32/lib/:/usr/local/protocol-c-1.0-m32/lib/"
构造测试文件 test-full.pb.cc
/usr/local/protocol-2.5-m32/bin/protoc test-full.proto --cpp_out=./
gcc -m32 cxx-generate-packed-data.cc ../test-full.pb.cc -I../ -I../../ -I/usr/local/protocol-c-1.0-m32/include/ -I/usr/local/protocol-2.5-m32/include/ -o test -L/usr/local/protocol-c-1.0-m32/lib/ -lprotobuf-c
./test

㈥ Protobuf协议实现原理

protobuf 是Google开源的一款支持跨平台、语言中立的结构化数据描述和高性能序列化协议,此协议完全基于二进制,所以性能要远远高于JSON/XML。由于出色的传输性能所以常见于微服务之间的通讯,其中最为着名的是Google开源的 gRPC 框架。

那么protobuf是如何实现高性能的,又是如何实现数据的编码和解码的呢?

基于128bits的数据存储方式(Base 128 Varints)

Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。

比如对于 int32 类型的数字,一般需要 4 个 byte 来表示。但是采用 Varint,对于很小的 int32 类型的数字,则可以用 1 个 byte 来表示。当然凡事都有好的也有不好的一面,采用 Varint 表示法,大的数字则需要 5 个 byte 来表示。从统计的角度来说,一般不会所有的消息中的数字都是大数,因此大多数情况下,采用 Varint 后,可以用更少的字节数来表示数字信息

Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。因此小于 128 的数字都可以用一个 byte 表示。大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010。

另外如果从数据大小角度来看,这种表示方式比实现的数据多了一个bit, 所以其实际传输大小就多14%(1/7 = 0.142857143)。

数字1表示方式:0000 0001

对于小的数据比较好理解,正常情况下1的二进制是 0000 0001,使用128bits表示的话,首位结束标识位也是0,所以两者结果是一样的 0 000 0001。

数字 300 表示方式:1010 1100 0000 0010

<figcaption>300</figcaption>

这个有点不太好理解了,这是因为原本用一个字节(8bit)就可以表示,但由于使用128bits表示方法,需要对每个字节的最高位添加一个结束标识位来表示,所以一个字节已经不够用了,需要占用两个字节来表示,其中两个字节最高位都是结束标识位。

如果正向推算的话,我们知道数字300的二进制值 1 0010 1100,用两个字节表示完整值则为
0000 0001 0010 1100 # 二进制
_000 0010 _010 1100 # 二进制每个字节的最高位向左移动一个位置,放入结束标识位
0 000 0010 1 010 1100 # 转换为128bits方式,1:结束,0:未结束
1 010 1100 0 000 0010 # 转换为 小端字节序 , 低字节在前,高字节在后

注意这里是先添加结束标识符,然后再转为小端字节序。

消息经过序列化后会成为一个二进制数据流,该流中的数据为一系列的 Key-Value 对。如下图所示:

采用这种 Key-Pair 结构无需使用分隔符来分割不同的 Field。 对于可选的 Field,如果消息中不存在该 field,那么在最终的 Message Buffer 中就没有该 field ,这些特性都有助于节约消息本身的大小。

Key 用来标识具体的 field,在解包的时候,客户端创建一个结构对象,Protocol Buffer 从数据流中读取并反序列化数据,并根据 Key 就可以知道相应的 Value 应该对应于结构体中的哪一个 field。

而Key也是由以下两部分组成

Key 的定义如下:

| 1 | (field_number << 3) | wire_type |

可以看到 Key 由两部分组成。第一部分是 field_number 。第二部分为 wire_type 。表示 Value 的传输类型。

一个字节的低3位表示数据类型,其它位则表示字段序号。

Wire Type 可能的类型如下表所示:

在我们的例子当中,field id 所采用的数据类型为 int32,因此对应的 wire type 为 0。细心的读者或许会看到在 Type 0 所能表示的数据类型中有 int32 和 sint32 这两个非常类似的数据类型。Google Protocol Buffer 区别它们的主要意图也是为了减少 encoding 后的字节数。

每个数据头同样采用128bits方式,一般1个字节就足够了,

本例中字段a 的 序号是1

如上创建了 Test1 的结构并且把 a 的值设为 2,序列化后的二进制数据为
0 000 1000 0 000 0010

Key 部分是 0000 1000
value 部分是 0000 0010, 其中字节最高位是结束标识位,即10进制的2,我们在转换的时候统一将符号位转为0即可。

协议规定数据头的低3位表示wire_type, 其它字段表示字段序号field_number,因此
0000 1000
_000 1000 # 去掉结束标识符位
_000 1000 # 000 表示数据类型, 这里是Varint
_000 1000 # 0001 这四位表示字段序号

https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

原文: https://blog.haohtml.com/archives/20215

热点内容
betweenand的用法sql 发布:2025-05-14 18:39:25 浏览:248
tplink摄像头存储卡格式化 发布:2025-05-14 18:37:08 浏览:345
安卓平板怎么安装excel的软件 发布:2025-05-14 18:35:44 浏览:40
广州数控圆弧编程实例 发布:2025-05-14 18:25:00 浏览:399
搭建服务器能使用nodejs开发吗 发布:2025-05-14 18:24:14 浏览:134
alook浏览器安卓哪个版本上网最快 发布:2025-05-14 18:22:33 浏览:456
sqldist 发布:2025-05-14 18:08:18 浏览:162
人行外管局编译 发布:2025-05-14 18:07:33 浏览:649
安卓手机如何使用大流量 发布:2025-05-14 17:47:34 浏览:82
精密模具编程 发布:2025-05-14 17:45:16 浏览:499