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(管理员)输入命令:

  1. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

回车输入Y并重启。,重启打开Ubuntu的命令窗口,即可正常安装了。

三:换源以及中文字体

3.1换源

我们安装好之后,就可以打开ubuntu了,不过可惜的是微软没有提供图形化的界面,所以只能是命令操作,不过这样也很好了,我们能做许多事情了。但是我们还是要想办法给他配一个图形界面,不过在这之前,我们要换成国内的源,不然下载速度太慢了。输入命令:

  1. sudo nano /etc/apt/sources.list

这里如果你没有安装nano会提示你安装,命令:

  1. sudo apt-get install nano

我们通过nano进入sources.list文件之后,把里面的源都用#禁止掉,或者全部删除,用以下阿里的源来代替:

  1. deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
  2. deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
  3. deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
  4. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
  5. deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
  6. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
  7. deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
  8. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
  9. deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  10. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

如果,有点不懂,可以看图:

技术图片

粘贴好 然后Ctrl+O(保存),按回车,再Ctrl+X(退出)。这就是nano命令,不会的搜索教程,保存退出之后,输入更新源列表命令:

  1. sudo apt-get update

跟新源完成之后 ,我们然后更新已安装使所有软件:

  1. sudo apt-get upgrade

【ps:sudo的时候输入密码嫌麻烦,可以修改/etc/sudoers如下内容即可(改为nopasswd:ALL)】更新软件过程很慢,慢慢等吧。

3.2中文字体设置

查看系统类型:

  1. cat /proc/version

查看中文字体:

  1. fc-list :lang=zh-cn

系统没中文语言包的话,先安装中文语言包:

  1. sudo apt-get install ttf-wqy-zenhei
  2. sudo apt-get install language-pack-zh-hans

两条命令一条一条执行,安装完成再检查中文字体,命令在上面,如图:

技术图片

可以用vim,也可以用nano,不过nano简单好用点,这里大鸟用nano来修改,命令如下:

  1. #打开文件配置
  2. nano .profile
  3. #然后在文本最末尾添加以下内容:
  4. export LANG="zh_CN.UTF-8"
  5. export LC_ALL="zh_CN.UTF-8"
  6. #然后Ctrl+O,按回车,再Ctrl+X,保存退出。

额,可以看图来的更直观一点:

技术图片

输入命令:

  1. 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系统:

  1. #关闭系统
  2. net stop LxssManager
  3. #开启系统
  4. 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下执行命令:

  1. 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并且中执行:

  1. export DISPLAY=localhost:0
  2. ccsm

在 X-windows 中,即会弹出 ccsm 的配置界面,勾选需要的 Desktop 组件(只需要勾选 Desktop 中的 Ubuntu Unity Plugin 即可,其它默认):

技术图片

点击 close 关闭 ccsm,执行命令:

  1. 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)的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

Windows 环境下的 protoc 安装(转)

java 怎么使用protobuf库

golang 使用 protobuf 的教程

Go使用protobuf

Win32API 常用消息