基于Protobuf C++ serialize到char*的实现方法分析
protobuf的Demo程序是
C++版本的protubuf有几种serialize和unSerialize的方法:
方法一:
// Write the new address book back to disk.
fstream output(argv[1], ios::out | ios::trunc | ios::binary);
if (!address_book.SerializeToOstream(&output)) {
cerr << "Failed to write address book." << endl;
return -1;
}
// Read the existing address book.
fstream input(argv[1], ios::in | ios::binary);
if (!input) {
cout << argv[1] << ": File not found. Creating a new file." << endl;
} else if (!address_book.ParseFromIstream(&input)) {
cerr << "Failed to parse address book." << endl;
return -1;
}
上面采用的是fstream,把数据序列(反序列)打磁盘文件中。
而如果想序列到char *,并且通过socket传输,则可以使用:
int size = address_book.ByteSize();
void *buffer = malloc(size);
address_book.SerializeToArray(buffer, size);
使用ostringstream ,
std::ostringstream stream;
address_book.SerializeToOstream(&stream);
string text = stream.str();
char* ctext = string.c_str();
相关推荐
-
string与char*转换的使用详解
复制代码 代码如下: //string --> const char string str2ch: str2ch.c_str(); //============================= //string --> char * //先转为 const char , 然后 转char * char TargetFile[strlen(TorrentFileNameDown.c_str())]; strcpy(TargetFile,TorrentFileNameDown.c_str(
-
C++中char*转换为LPCWSTR的解决方案
前言 大家在学习或者使用Windows编程中,经常会碰到字符串之间的转换,char*转LPCWSTR也是其中一个比较常见的转换.下面就列出几种比较常用的转换方法.大家可以根据自己的需求选择相对应的方法,下面来一起学习学习吧. 1.通过MultiByteToWideChar函数转换 MultiByteToWideChar函数是将多字节转换为宽字节的一个API函数,它的原型如下: int MultiByteToWideChar( UINT CodePage, // code page DWORD d
-
深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
复制代码 代码如下: #ifndef USE_H_ #define USE_H_ #include <iostream> #include <windows.h> #include <string> using namespace std; class CUser { public: CUser(); virtual~ CUser(); char*
-
浅谈char*类型返回值和字符串常量
看这样一段简单的程序: #include <stdio.h> char* fun() { return "fun"; } int main() { printf("%s", fun()); return 0; } 这段程序可以正常run,但是最好不要这么做. 因为 直观上你返回了一个局部的东西出去. 你可以再外面定义这个常量,然后返回. 另外,字符串常量不可修改,而char*意味着要修改,故此最好加上const. 以上就是小编为大家带来的浅谈char
-
C语言中判断一个char*是不是utf8编码
C语言中判断一个char*是不是utf8编码 里我修改了一下, 纯ASCII编码的字符串也返回true, 因为UTF8和ASCII兼容 实例代码: int utf8_check(const char* str, size_t length) { size_t i; int nBytes; unsigned char chr; i = 0; nBytes = 0; while (i < length) { chr = *(str + i); if (nBytes == 0) { //计算字节数 i
-
C语言中char*和char[]用法区别分析
本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以: 当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written". 当用char s[]=&q
-
string,CString,char*之间的转化
string,CString,char*之间的转化 int 转 CString:CString.Format("%d",int);...............................string 转 CString CString.format("%s", string.c_str()); 用c_str()确实比data()要好. .......................................char* 转 CString CString.
-
浅析string 与char* char[]之间的转换
1.首先必须了解,string可以被看成是以字符为元素的一种容器.字符构成序列(字符串).有时候在字符序列中进行遍历,标准的string类提供了STL容器接口.具有一些成员函数比如begin().end(),迭代器可以根据他们进行定位. 注意,与char*不同的是,string不一定以NULL('\0')结束.string长度可以根据length()得到,string可以根据下标访问.所以,不能将string直接赋值给char*. 2.string 转换成 char * 如果要将string直接
-
基于Protobuf C++ serialize到char*的实现方法分析
protobuf的Demo程序是 C++版本的protubuf有几种serialize和unSerialize的方法: 方法一: 官方demo程序采用的是 复制代码 代码如下: // Write the new address book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr &l
-
jQuery基于ajax()使用serialize()提交form数据的方法
本文实例讲述了jQuery基于ajax()使用serialize()提交form数据的方法.分享给大家供大家参考,具体如下: jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直接选择form将其序列化,如: <form action=""> First name: <input type="text" name="FirstName" value=&qu
-
基于Protobuf动态解析在Java中的应用 包含例子程序
最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程. Protocol Buffers是结构化数据格式标准,提供序列化和反序列方法,用于存储和交换.语言中立,平台无关.可扩展.目前官方提供了C++.Java.Python API,也有其他语言的开源api(比如php).可通过 .proto文件生成对应语言的类代码 如果已知protobuf内容对应的是哪个类对象,则可以直接使用反序列化方法搞定(Xxx.parseFrom(inpu
-
基于JSON和java对象的互转方法
先说下我自己的理解,一般而言,JSON字符串要转为java对象需要自己写一个跟JSON一模一样的实体类bean,然后用bean.class作为参数传给对应的方法,实现转化成功. 上述这种方法太麻烦了.其实有一种东西叫jsonObject可以直接不用新建实体类bean,而实现转化,先说org.json.JSONObject这个JSONObject,贴上代码: import java.beans.IntrospectionException; import java.beans.Introspect
-
Java基于Runtime调用外部程序出现阻塞的解决方法
本文实例讲述了Java基于Runtime调用外部程序出现阻塞的解决方法, 是一个很实用的技巧.分享给大家供大家参考.具体分析如下: 有时候在java代码中会调用一些外部程序,比如SwfTools来转换swf.ffmpeg来转换视频等.如果你的代码这样写:Runtime.getRuntime().exec(command),会发现程序一下就执行完毕,而在命令行里要执行一会,是因为java没有等待外部程序的执行完毕,此时就需要使用阻塞,来等待外部程序执行结果: InputStream stderr
-
基于Django与ajax之间的json传输方法
前端使用ajax进行数据交互时: $.ajax({ cache: false, type: "POST", url: {% url ''%} data: $('#form').serialize(), async: true, success: function (data) { if (data.status == 'success') { $('#form')[0].reset(); alert("提交成功") } else if (data.status ==
-
基于自定义BufferedReader中的read和readLine方法
实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现BufferedReader功能 * 分析: * 缓冲区就是封装了一个数组,并对外提供了更多的方法对数组进行访问 * 其实这些方法最终操作的都是数组的角标 * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区,再从缓冲区取出数据 * 当此次取完后,继续从源中取出一批数据到缓冲区 * 当源中的数据取光时
-
Google.Protobuf工具在C#中的使用方法
protobuf是一个语言无关.平台无关的序列化协议,由谷歌开源提供.再加上其高性能.存储占用更小等特点,在云原生的应用中越来越广泛. 在C#中主要有两种方法来使用protobuf协议,nuget包分别为Google.Protobuf和protobuf-net,其中Google.Protobuf由谷歌官方提供.本文简要记录和展示Google.Protobuf的使用方法和特点. 项目资料及文档 项目官网:https://developers.google.cn/protocol-buffers?h
-
AngularJS基于provider实现全局变量的读取和赋值方法
本文实例讲述了AngularJS基于provider实现全局变量的读取和赋值方法.分享给大家供大家参考,具体如下: 简单全局变量的设置 1,通过var 直接定义global variable,这根纯js是一样的. 2,用angularjs value来设置全局变量 . 3,用angularjs constant来设置全局变量 . 示例代码如下: 在app文件中,声明三种变量 'use strict'; /* App Module */ var test2 = 'tank'; //方法1,定义全局
-
基于原生ajax与封装的ajax使用方法(详解)
当我们不会写后端接口来测试ajax时,我们可以使用node环境来模拟一个后端接口. 1.模拟后端接口可参考网站整站开发小例子,在打开命令窗口并转到所在项目文件夹下在命令行中输入npm install express --save,安装express中间件. 2.把当中的app.js的内容换成 var express=require('express'); //var path=require('path'); var app=express(); //app.set('view',path.jo
随机推荐
- IOS实战之自定义转场动画详解
- SpringMVC环境下实现的Ajax异步请求JSON格式数据
- windows下通过批处理连接VPN修改路由表的代码
- Ruby中的p和puts的使用区别浅析
- springboot扫描自定义的servlet和filter代码详解
- Python高效编程技巧
- 详解Swift编程中的for循环的编写方法
- js中一个函数获取另一个函数返回值问题探讨
- javascript轻松实现当鼠标移开时已弹出子菜单自动消失
- IE:如何使用断点续传功能
- 信息发布中的判断过期和有效期的东西
- Mysql存储引擎InnoDB和Myisam的六大区别
- 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)
- 简单判断MSSQL数据库版本(2000或者2005)
- js本身的局限性 别让javascript做太多事
- 设计模式中的组合模式在JavaScript程序构建中的使用
- 关于c语言的一个小bug详解
- Yii基于数组和对象的Model查询技巧实例详解
- MFC控件之CListCtrl的应用实例教程
- 浅谈Django中view对数据库的调用方法