首页 > 编程语言 >protobuf使用(c++)

protobuf使用(c++)

时间:2023-12-10 22:11:07浏览次数:43  
标签:protobuf PROTO c++ FILE 使用 data example DIR

protobuf是什么

ptotobuf是谷歌的语言无关、平台无关可扩展的序列化结构数据格式,例如XML,但是更小、更快、更简单。你只需定义一次结构化数据,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取到各种数据流,并且夸语言。

protobuf怎么用

版本及环境

protobuf版本:3.21.12 (3.22及之后版本需要依赖abseil-cpp)
环境:linux

安装

  1. 下载源码:https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protobuf-cpp-3.21.12.tar.gz
  2. 解压、编译、安装
    • tar zxvf protobuf-cpp-3.21.12.tar.gz
    • mkdir build; cd build; cmake .. -DCMAKE_INSTALL_PREIFX=/you/install/dir; make -j
    • make install

使用例子

  1. 目录结构:
examples/
├── CMakeLists.txt
├── protoc
│   └── example.proto
└── src
    └── example.cpp
  1. proto文件(具体可参考:Language Guide (proto 3))
syntax = "proto3"; // 声明使用的语法版本

package example; // 包名
// 消息结构定义,包含一个整数和一个字符串
message Msg {
    int32 id = 1;
    string name = 2;
}
  1. cmake文件
cmake_minimum_required(VERSION 3.16)
project(example)
set(CMAKE_CXX_STANDARD 11)

set(PROTOC_BIN /you/install/dir/bin/protoc)
set(PROTO_FILE_DIR /you/project/dir/examples/protoc)

add_custom_command(
  OUTPUT ${PROTO_FILE_DIR}/example.pb.h ${PROTO_FILE_DIR}/example.pb.cc
  COMMAND ${PROTOC_BIN} -I${PROTO_FILE_DIR} example.proto --cpp_out=${PROTO_FILE_DIR}
  DEPENDS ${PROTO_FILE_DIR}/example.proto
)

include_PROTO_FILE_DIRectories(~/tools/include/)
include_PROTO_FILE_DIRectories(~/tools/protobuf/examples/protoc/)
link_PROTO_FILE_DIRectories(~/tools/lib)

add_executable(example src/example.cpp ${PROTO_FILE_DIR}/example.pb.cc)
target_link_libraries(example protobuf)
  1. 源文件
#include "example.pb.h"

#include <cstdio>
#include <string>

void dump(std::string& data) {
  for (size_t i = 0; i < data.size(); i++) {
    printf("%02x ", data[i]);
  }
  printf("\n");
}
int main() {
  example::Msg msg;
  msg.set_id(1);
  msg.set_name("msg");
  std::string data;
  msg.SerializeToString(&data);
  dump(data);

  example::Msg msg1;
  msg1.ParseFromString(data);
  printf("id: %d; name: %s\n", msg1.id(), msg1.name().c_str());
  return 0;
}

输出如下:
08 01 12 03 6d 73 67
id: 1; name: msg

protobuf序列化说明

protobuf序列化是TLV格式即Tag-Length-Value

ID Name Used For
0 VARINT int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 I64 fixed64, sfixed64, double
2 LEN string, bytes, embedded messages, packed repeated fields
3 SGROUP group start (deprecated)
4 EGROUP group end (deprecated)
5 I32 fixed32, sfixed32, float

Tag = (field_number << 3) | wire_type
08 01 : 08 = (1 << 3) | 0; 01 = 1(id的值)
12 03 6d 73 67: 12 = (2 << 3) | 2; 03 = 3(msg长度); 6d 73 67 = msg(msg的ascii码)

如果深入了解可以搜索:Varint Zigzag 编解码


引用

Protocol Buffer官方文档

标签:protobuf,PROTO,c++,FILE,使用,data,example,DIR
From: https://www.cnblogs.com/rainbowball/p/17893347.html

相关文章

  • 【持续更新】Archlinux使用过程中的问题
    一、添加archlinuxcn源之后安装archlinuxcn-keyring失败错误信息:~❯sudopacman-Sarchlinuxcn-keyring10s21:11:21正在解析依赖关系...正在查找软件包冲突...软件包(1)archlinuxcn-keyring-20230923-1......
  • Qt6 c++教程9测试&调试
    9测试&调试调试和测试是软件开发的重要组成部分。在本章中,你将学习如何调试Qt项目、不同的调试技术以及Qt支持的调试器。调试是发现错误或不希望出现的行为的根本原因并加以解决的过程。我们还将讨论使用QtTest框架进行单元测试。QtTest是基于Qt的应用程序和库的单元测试......
  • C++聊天集群服务器6
    一、客户端开发代码如下:#include"json.hpp"#include<iostream>#include<thread>#include<string>#include<vector>#include<chrono>#include<ctime>#include<unordered_map>#include<functional>usingn......
  • 使用AWS CLI精通AWS ECS:部署和管理的综合指南
    亚马逊弹性容器服务(AmazonElasticContainerService,ECS)为部署和管理容器化应用提供了强大的平台。在本指南中,我们将通过AWS命令行界面(CLI)探讨如何无缝地执行常见的ECS任务。无论您是初学者还是经验丰富的用户,本逐步教程都将帮助您轻松地导航ECS集群、任务和服务。先决条件在我们......
  • burp技术主题基本技能之使用HTML编码与前导零进行xss bypass
    使用编码对攻击进行模糊处理https://portswigger.net/web-security/all-topicsburp官网所有技术主题基础技能URLdecoded服务器端;HTMLdecoded客户端inputfilters输入过滤器:还需要对输入进行解码,检查输入安全性为什么要编码?[...]/?search=Fish+&+Chips&有特......
  • C++第一课
    之前不太会C++,在leetcode上尝试用C++解决算法问题这里我想使用CLion调试我的C++程序那么问题产生,我该如何创建我的第一个C++项目呢?step1.打开我的CLionso,那么现在我想知道C++Executable和C++Library的区别根据我的编程经验应该不选择C++LibraryC++Executab......
  • centos使用htop查看资源
    环境centos7.9介绍htop是一个用于实时查看和管理系统的进程、内存、CPU使用情况的命令行工具。它提供了一个友好的界面,可以轻松地在终端中监控你的Linux系统。使用安装yuminstallhtop-y如果没有次安装包,更新最新的源yuminstallepel-release-y启动htop3.......
  • C++学习笔记五:变量与数据类型(Auto类型)
    Auto允许编译器自己来推断变量的类型,这种新功能是在c++11引入的。这个关键字结合for循环使用可以节省变量类型的重复输入。VSCode可以在鼠标移动到变量上之后直接显示变量的类型。autovar1{12};//intautovar2{13.0};//doubleautovar3{14.0f};//floatautovar4{15......
  • PHP中cookie,session的使用和用户自动登录的实现
    cookie的使用//生成cookie//注释:setcookie()函数必须位于<html>标签之前。//setcookie(name,value,expire,path,domain);//名称,值,过期时间,有效路径,有效域名//path,可选;如果路径设置为"/",那么cookie将在整个域名内有效.如果路径设置为"/test/",那么cookie将在test......
  • 蛋白质组搜库软件MaxQuant使用教程
    目录MaxQuant基本原理MaxQuant使用MaxQuant实操MaxQuant基本原理MaxQuant使用MaxQuant实操更多信息请关注:......