win32下protobuf 的使用(附带cmake的简单使用,包含复杂字段repeated)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32下protobuf 的使用(附带cmake的简单使用,包含复杂字段repeated)相关的知识,希望对你有一定的参考价值。
参考技术A 自行编写proto文件,文件后缀为.proto。syntax="proto2";
package RingBind;
message MBUI_GetOrSetRingBinding
optional int32 hSeeion = 1;
optional int32 CircuitID = 2;
optional MBUI_RingBindingVec oRingBinding = 3;
message MBUI_RingBindingVec
repeated MBUI_RingBind oRingBind = 1;
message MBUI_RingBind
optional int32 iStartNeID = 1;
optional int32 iEndNeID = 2;
optional int32 iRingID = 3;
///////在上一步生成的protoc.exe目录下cmd运行 protoc.exe,protoc --cpp_out=./ test .proto,成功会生成两个文件test.pb.h和test.pb.cc。这两个文件就相当于脚本给你生成的一个类,在你的项目中直接添加现有项就可以。
#include <iostream>
#include <fstream>
#include <string>
#include "RingBind.pb.h"
using namespace std;
void InitRingBind(RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
//为message的简单类型(int32,bool等)赋值
oGetOrSetRingBinding.set_hseeion(998);
oGetOrSetRingBinding.set_circuitid(15390);
//为内嵌的message分配内存,这里的内嵌message的类型类型像Vector(数组),pRingBindingVec类似数组的首地址
RingBind::MBUI_RingBindingVec *pRingBindingVec =
oGetOrSetRingBinding.mutable_oringbinding();
//为数组添加一个元素
RingBind::MBUI_RingBind *pRingBind = pRingBindingVec->add_oringbind();
//为数组的第一个元素赋值
pRingBind->set_istartneid(690);
pRingBind->set_iendneid(640);
pRingBind->set_iringid(181135);
void WriteRingBind2File(string &out, RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
fstream file(out.c_str(), ios::out | ios::trunc | ios::binary);
if (!file.is_open())
cout << out.c_str() << " open failed" << endl;
return;
oGetOrSetRingBinding.SerializePartialToOstream(&file);
file.close();
void readRingBind2File(string &in, RingBind::MBUI_GetOrSetRingBinding &oGetOrSetRingBinding)
fstream file(in.c_str(), ios::in | ios::binary);
if (!file.is_open())
cout << in.c_str() << " open failed" << endl;
return;
//从文件中解析出对象信息输出
oGetOrSetRingBinding.ParseFromIstream(&file);
cout << "hseeion: " << oGetOrSetRingBinding.hseeion() << endl;
cout << "circuitid: " << oGetOrSetRingBinding.circuitid() << endl;
const RingBind::MBUI_RingBindingVec oRingBindVec =
oGetOrSetRingBinding.oringbinding();
for (int i = 0; i < oRingBindVec.oringbind_size()/*获取数组的大小*/; i++)
const RingBind::MBUI_RingBind oRingBind = oRingBindVec.oringbind(i);
cout << "istartneid: " << oRingBind.istartneid() << endl;
cout << "istartneid: " << oRingBind.iendneid() << endl;
cout << "istartneid: " << oRingBind.iringid() << endl;
file.close();
int main()
RingBind::MBUI_GetOrSetRingBinding oGetOrSetRingBinding;
InitRingBind(oGetOrSetRingBinding);
string FileName("ser.txt");
WriteRingBind2File(FileName, oGetOrSetRingBinding);
RingBind::MBUI_GetOrSetRingBinding rGetOrSetRingBinding;
readRingBind2File(FileName, rGetOrSetRingBinding);
system("pause");
return 0;
运行结果:
win10安装子系统ubuntu附带图形化界面
Win10 应用商店中可以下载安装到可以在 Windows 10 里运行的 Ubuntu、Fedora、SUSE Linux、Arch 等 Linux 子系统。
也就是说,我们可以像安装 APP 那样简单地一键下载安装和运行 Ubuntu,并在无需重启或安装虚拟机的情况下,使其与 Windows10 同时「并行」运行。然而,在安装后出现的仅仅是一个命令行形式的终端,即便如此,也是很好的,可在终端学习命令、安装lnmp环境等等。
在Windows10 应用商店中安装Ubuntu,并且配置桌面。大鸟的系统是windows10家庭版,我很像换一个专业版的,有什么好方法,可以偷偷告诉大鸟!
一:设置子系统环境
打开控制面板→卸载程序→启用或关闭windows功能→勾选上适用于Linux的windows子系统,然后确定,完成会提示重启电脑,确定重启,等重启电脑后在操作。
如果,有安装什么奇葩杀软的,都暂时先关闭,以防止有什么灵异的错误。
二:安装ubuntu子系统
打开Windows10应用商店,搜索ubuntu,然后选择18.04的版本,然后点击获取安装。如图:
安装过程很慢,要等个5分钟左右,也要视网络情况而定。安装完成,开始菜单会显示ubuntu。我们点击打开:
打开之后会提示你开始安装,你需要等待一点时间,安装过程也有点慢。
安装好之后,会提示输入用户名和密码,Linux中输入密码是看不到的,所以你不要紧张,正常输入即可。
2.1:Error Code: 0x8007019e或者Error Code: 0x8000000D
可能会遇到错误,大鸟自己是遇到了,我们按键win+x,选择Windows PowerShell(管理员)输入命令:
- Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
回车输入Y并重启。,重启打开Ubuntu的命令窗口,即可正常安装了。
三:换源以及中文字体
3.1换源
我们安装好之后,就可以打开ubuntu了,不过可惜的是微软没有提供图形化的界面,所以只能是命令操作,不过这样也很好了,我们能做许多事情了。但是我们还是要想办法给他配一个图形界面,不过在这之前,我们要换成国内的源,不然下载速度太慢了。输入命令:
- sudo nano /etc/apt/sources.list
这里如果你没有安装nano会提示你安装,命令:
- sudo apt-get install nano
我们通过nano进入sources.list文件之后,把里面的源都用#禁止掉,或者全部删除,用以下阿里的源来代替:
- deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
- deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
- deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
- deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
- deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
- deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
- deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
- deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
- deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
- deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
如果,有点不懂,可以看图:
粘贴好 然后Ctrl+O(保存),按回车,再Ctrl+X(退出)。这就是nano命令,不会的搜索教程,保存退出之后,输入更新源列表命令:
- sudo apt-get update
跟新源完成之后 ,我们然后更新已安装使所有软件:
- sudo apt-get upgrade
【ps:sudo的时候输入密码嫌麻烦,可以修改/etc/sudoers如下内容即可(改为nopasswd:ALL)】更新软件过程很慢,慢慢等吧。
3.2中文字体设置
查看系统类型:
- cat /proc/version
查看中文字体:
- fc-list :lang=zh-cn
系统没中文语言包的话,先安装中文语言包:
- sudo apt-get install ttf-wqy-zenhei
- sudo apt-get install language-pack-zh-hans
两条命令一条一条执行,安装完成再检查中文字体,命令在上面,如图:
可以用vim,也可以用nano,不过nano简单好用点,这里大鸟用nano来修改,命令如下:
- #打开文件配置
- nano .profile
- #然后在文本最末尾添加以下内容:
- export LANG="zh_CN.UTF-8"
- export LC_ALL="zh_CN.UTF-8"
- #然后Ctrl+O,按回车,再Ctrl+X,保存退出。
额,可以看图来的更直观一点:
输入命令:
- sudo dpkg-reconfigure locales
用键盘pagedown (↓)选择zh_CN.UTF-8(按空格键选择,按Tab键移动到确定,按回车键确定)
按enter确认;到下一步,选择zh_CN.UTF-8(按回车键确定)
按键盘enter确认,等待生成结束。用sudo su
命令切换到root,执行local
发现已经语言已经是中文了。
3.4重启Ubuntu系统
在windows的cmd窗口(用管理员身份来运行)输入命令来重启Ubuntu系统:
- #关闭系统
- net stop LxssManager
- #开启系统
- net start LxssManager
如果不知道什么管理员身份来运行cmd,打开cortana,输入cmd就能找到了,我们看图:
这样,我们已经安装好了ubuntu,并且配置了中文语言环境,这样已经可以使用了,其实不配置中文环境也没什么,就前面讲的安装好,ubuntu子系统就可以用命令来交互了。更换源,以及跟换中文语言环境纯粹是瞎折腾。
四:配置桌面环境
上面的更换为阿里源还是很有必要的,防止有什么灵异情况出现。因为大鸟一开始没换源,导致ubuntu unity plugin中是不能安装。
4.1安装 X-Windows
可供选择安装的 X-Windows 有多个:VcXsrv Windows X Server、Xming、Cygwin X Server,教程中选择的是 VcXsrv,因为比较容易和稳定。
下载地址:https://sourceforge.net/projects/vcxsrv/
下载之后,双击安装,没什么好说,一路默认安装即可,在安装完毕后,开始菜单中出现「XLaunch」图标,双击运行,选择:“one large window”,Display number 设置成 0,其它一路默认,如图:
4.2WSL 安装桌面环境
ubuntu bash下执行命令:
- sudo apt-get install ubuntu-desktop unity compizconfig-settings-manager
需要提醒的是,Ubuntu 桌面版自带的 unity 桌面环境与依赖包有 600 多 M,解压之后近 2.6G,所以前提需要保证足够的磁盘空间。整个执行过程很漫长,但是换源之后时间可缩短一半,多久我就不告诉你们了,是个坑想搞的只能跳下去。
4.3配置 compiz 并运行桌面环境
启动 XLaunch,选择:“one large window”,Display number 设置成 0,其它一路默认,这里在上面设置过了,如果你没关就不用重现选择了,如果不小心关掉了,那么就重新来一次吧。我们用管理员身份运行ubuntu Bash并且中执行:
- export DISPLAY=localhost:0
- ccsm
在 X-windows 中,即会弹出 ccsm 的配置界面,勾选需要的 Desktop 组件(只需要勾选 Desktop 中的 Ubuntu Unity Plugin 即可,其它默认):
点击 close 关闭 ccsm,执行命令:
- compiz
短暂的加载后,在 X-windows 的界面中就能看到桌面版的 Ubuntu 了。
就这样,安装成功。
也可以使用window自带 win+r 输入mstsc 输入127.0.0.1:3390 输入ubuntu用户名密码
五:总结
当然不止这一种连接桌面的方法,vncserver、xrdp桌面都可以连接到桌面,但是大鸟不想折腾了,留个想折腾的人折腾去吧。
其实也没必要安装桌面,就在bash中学习linux也是个好方法,这个原理和docker很像,所加上微软本身开发支持,所以比虚拟机强很多倍,流畅度还是很不错的,但是有时候不稳定。
参考资料:
- https://zhuanlan.zhihu.com/p/37643715
- https://www.windows10.pro/bash-on-ubuntu-on-windows/
- 转载至大鸟博客https://www.daniao.org/5258.html
以上是关于win32下protobuf 的使用(附带cmake的简单使用,包含复杂字段repeated)的主要内容,如果未能解决你的问题,请参考以下文章