Protocolbuff

目录

1       Protocolbuff定义和作用... 1

2       Protocolbuff的使用步骤... 1

3       .proto编写格式... 3

3.1      编写示例... 3

3.2      变量修饰符required 、optional、repeated. 4

3.3      基本数据类型... 4

1         Protocolbuff定义和作用

Protocolbuff是一种数据存储传输格式,类似于Json、XML 数据存储格式。发送方将结构体序列化为二进制字节码,可以减少传输字节数量,增强安全性。接收方将字节码再反序列化为结构体。解析快速,无需像json或者xml那样,两边添加生成报文和解析报文的编码;

优缺点

优点:Protocolbuff将结构体或对象转换成二进制串,所以体积小,传输快,使用简单,加密性好;

缺点:可读性差,通用性差;

2         Protocolbuff的使用步骤

(1)    下载protoc.exe文件

源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://github.com/google/protobuf/releases

(2)编写结构体的.proto文件CommEventLog.proto

(3)在window系统下,在protoc.exe所在的文件夹打开cmd,用如下命令生成C++的结构体文件;

protoc –I=./ --cpp_out=./ ./ CommEventLog.proto

protoc执行程序,后面的是命令行参数

-I 输入目录

--cpp_out 输出目录

./ CommEventLog.proto表示需要转换的文件;

最后输出的结果是C++的类文件CommEventLog.pb.cc和CommEventLog.pb.h

(4)将CommEventLog.pb.cc和CommEventLog.pb.h两个文件复制到需要的工程。包含如下头文件,添加libprotobuf.lib、libprotobuf.dll。代码中创建类的对象,CommEventLog evnetlog;

(5)接收到二进制字节码时,用对象的方法ParseFromArray 去将二进制字节码转化为结构体;

if (evnetlog.ParseFromArray(buff,bufflen)==true)

{}

(6)然后就可以用变量名称命名的方法去获取变量的值;

string strtime=evnetlog.start_time();

3         .proto编写格式

3.1  编写示例

Proto文件开头定义一个包名,即命名空间,为了避免不项目的命名冲突问题。然后用关键字message来定制结构体;

package protocobuff_Demo;//包名

message CommEventLog

{

required string log_id               =     1;//日志Id,唯一标识一次发生的事件

required int32  event_state      =   2;//事件状态,事件状态为开始或者瞬时时保存事件,状态为结束时更新日志结束时间,状态为更新时保存联动结果;0: 瞬时事件,保存;1: 事件开始,保存;2: 事件结束,更新结束时间;3: 事件脉冲,客户端和服务器使用,CMS不用;4: 事件更新,联动结果更新

optional int32  event_level            =     3;//事件等级

optional string unit_idx           =     4;//控制中心编号

optional int32  event_type            =     5;//事件类型

optional string event_type_name    =     6;//事件类型名称

optional int32 sub_sys_type     =   7;//事件所属子系统类型,废弃,事件整改,没有子系统属性了2015-10-28 13:45:13

optional string event_name             =     8;//事件名称

optional string start_time         =     9;//事件开始时间

optional string stop_time       =       10;//事件结束时间

optional string source_idx        =     11;//事件源编号

optional int32 source_type              =     12;//事件源类型

optional string source_name           =     13;//事件源名称

optional string log_txt                     =     14;//事件描述信息

optional string region_idx        =     15;//事件源区域编号,可选

optional bytes  ext_info        =   20;//事件扩展信息,各个子系统根据子系统的消息结构体定义解析

repeated int32  user_id                 =     21;//事件接收的User Id数组,用于日志查询权限控制

}

3.2  变量修饰符required 、optional、repeated

变量修饰符的作用是修饰变量,确定变量是否必须赋值。

3.3  基本数据类型

基本数据类型用于定义变量类型。与编程语言的中的变量类似,名称稍有不同,含义一致。

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

百度云盘下载地址:

链接:https://pan.baidu.com/s/1swkQzCIKI3g3ObcebgpIDg

提取码:mc8l

微信公众号获取最新的软件和视频介绍

QStockView

参考文献

https://www.cnblogs.com/xinmengwuheng/p/7070393.html

https://cloud.tencent.com/developer/article/1394349

谷歌protocolbuff使用说明步骤的更多相关文章

  1. 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解

    原作者:PG     整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...

  2. GCM 发送接收消息 Message Client Server 服务器端,客户端

    GCM 传递参数 最近用了很多时间做GCM,由于碰到很多问题,因此详细做一下记录,以方便各位网友,不用再走我的重复的路.不过我试了一下GCM在国内很不好用.假如开发国外的程序的话,用GCM倒是很不错的 ...

  3. Mysql存储过程历史表备份

    应用背景 SCADA采集系统需要将实时数据存入历史表.问题1:如何更简单的添加历史数据?2.海量历史数据,比如年数据,如何快速筛选 画曲线? 利用mysql的事件,每小时存一次采集数据: 每月备份历史 ...

  4. 微信小程序的模板消息与小程序订阅消息

    小程序订阅消息 功能介绍 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验. 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳 ...

  5. 谷歌日志库GLog 使用说明

    1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...

  6. Gradle+IDEA使用说明

    Gradle+IDEA使用说明 导语: IDEA拥有大量的JAVA开发者拥护,相比于开源的eclipse,IDEA拥有更简洁直观的界面,拥有更强大的自动补全功能,号称能“一路敲回车完成编码”.如果把I ...

  7. Cisco模拟器Web-IOU使用说明 转

    http://blog.sina.com.cn/s/blog_af0abf1f0102uztk.html   GNS3作为使用最多的Cisco官方模拟器,是因为它使用简单,所有设置图形化,是一款非常强 ...

  8. UNICODE本地编译freescale的i.MX6Q的android4.2.2&android4.4.2 && 全志a80的步骤x1

    20151031本地编译freescale的i.MX6Q的android4.2.2&android4.4.2 && 全志a80的步骤x1 2015/10/31 15:07 开始 ...

  9. 3.Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)

    1.kali默认是没有中午输入法的,需要自己安装一下 2.首先我们先获取root权限 dnt@HackerKali:~$ su密码: 3.安装中文输入法(apt-get 指令不会的同学可以学习一下基础 ...

随机推荐

  1. C#中word文档转html

    var path = Request.Url.Host + ":" + Request.Url.Port + list[i].AnnexPath; //html保存路径 strin ...

  2. 【html】 iframe 和 frameset 的区别

    一.两者的相同点和不同点 相同点: iframe 和frameset都是html布局的框架布局 不同点: iframe是一个内联框架,是在页面里生成内部框架 frameset定义一个框架集,包含多个子 ...

  3. [git] Updates were rejected because the tip of your current branch is behind its remote counterpart.

    场景 $ git push To https://github.com/XXX/XXX ! [rejected] dev -> dev (non-fast-forward) error: fai ...

  4. JavaScript函数式编程——柯里化

    柯里化原理 如何实现柯里化 柯里化的应用 一.柯里化原理 柯里化:在数学和计算机科学中,柯里化是一种使用多个参数的一个函数转换成一系列使用一个参数的函数的技术. 前端使用柯里化的用途主要就应该是简化代 ...

  5. python 常见内置函数setattr、getattr、delattr、setitem、getitem、delitem

    常见内置函数 内置函数:在类的内部,特定时机自动触发的函数 示例1:setattr.getattr.delattr class Person: # def __init__(self, name): ...

  6. 完美解决Uncaught SyntaxError: Unexpected end of input

    Unexpected end of input  的英文意思是“意外的终止输入” 他通常表示我们浏览器在读取我们的js代码时,碰到了不可预知的错误,导致浏览器 无语进行下面的读取 通常造成这种错误的原 ...

  7. kubernetes资源清单之Deployment

    Deployment为Pod和ReplicaSets提供声明性更新 示例 --- apiVersion: apps/v1 kind: Deployment metadata:     name: de ...

  8. python常用模块:模块练习

    今日作业: 1.简述 什么是模块 模块就将一些函数功能封装在一个文件内,以‘文件名.py’命名,以“import 文件名”方式调用 模块有哪些来源  自定义.内置.DLL编译器.包模块的格式要求有哪些 ...

  9. 海康RTSP取流URL格式

    预览取流url [海康威视]举例说明: 主码流取流: rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream 子码流取流: rtsp://a ...

  10. Redis05——Redis高级运用(管道连接,发布订阅,布隆过滤器)

    Redis高级运用 一.管道连接redis(一次发送多个命令,节省往返时间) 1.安装nc yum install nc -y 2.通过nc连接redis nc localhost 6379 3.通过 ...