protobuflinux
㈠ 如何交叉編譯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