STL的string很强大,用起来也感觉很舒服,这段时间在代码中涉及到了用string存取二进制数据的问题,这里记录一下,以供以后参考。

首先提一下STL中string的参考资料:http://www.cplusplus.com/reference/string/string/ ,不懂的朋友可以看下。

在数据传输中,二进制数据的buffer一般用系统预设的大数组进行存储,而不是STL的string等,比如:

const int max_length = 1024 * 1024;
unsigned char data[max_length];

因为二进制数据中可能会包含0x00(即:'\0'),刚好是字符串结束标志……

如果我们的代码是如下写的:

char data[max_length];
size_t length = sockClient.read_some(boost::asio::buffer(data), ec);
string strData(data);

我只能说,这个处理字符串应该没问题,如果是二进制的话,会被string的构造函数给截断一部分,导致strData和data的数据不一致。

其实一个简单的demo就可以说明问题,比如如下代码:

#include <string>
#include <iostream>
using namespace std; int main()
{
char data[] = {'A','b',0x00,'c','d'};
string str1(data),str2(data,sizeof(data));
cout<<str1<<endl;
cout<<str1.size()<<endl;
cout<<str2<<endl;
cout<<str2.size()<<endl;
return 0;
}

运行效果:

Ab

2

Abcd

5

从运行结果不难发现,采用str2的那种方式就可以保证string中的数据和原始data中的数据一致。这是因为采用不同的构造函数不同,导致结构完全不一样,这个可以从我前面给出的网址中去查看具体的构造函数说明加以理解。

这里我们回到前面的那个问题,如果想保存二进制的话,我们应该如下操作:

char data[max_length];
size_t length = sockClient.read_some(boost::asio::buffer(data), ec);
string strData(data,length);

如果要取出数据的话,也简单(这个还以socket数据收发为例):

......
// deal with strData
......
boost::asio::write(sockClient, boost::asio::buffer(strData.c_str(),strData.length()));

这里的strData.c_str()即为数据,strData.length()即为要发送的数据长度(当然也可以使用strData.size()来操作)。

当然,我这里用string来存取二进制数据,也只是为了操作方便,感觉这个不是太好,应该会有很多朋友不提倡这种做法的,这里提供一个思路,大家觉得好就采用,觉得不好就一笑了之,呵呵……

好,就这些了,希望对你有帮助。

E-Mail : Mike_Zhang@live.com

 

用string存取二进制数据的更多相关文章

  1. Sword redis存取二进制数据

    #include "hiredis/hiredis.h" /* redis头文件 */ #include <stdio.h> #include <stdlib.h ...

  2. [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. sqlite3的图片的(二进制数据)存取操作

    sqlite3的图片的(二进制数据)存取操作   前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...

  4. Java/Android 二进制数据与String互转

    将经过加密的二进制数据保存到本地的方法 byte[] src = new byte[] { 122,-69, -17, 92, -76, 52, -21, -87, -10, 105, 76, -75 ...

  5. 【python】3.x,string与bytes的区别(文本,二进制数据)

    Python 3对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示, 二进制数据则由bytes类型表示. 不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也 ...

  6. 数据库中用varbinary存储二进制数据

    问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...

  7. IO流-文本IO\读写二进制数据

    文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读 ...

  8. 详细解读XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度

    本文主要参考:MDN 分析并操作 responseXML属性 如果你使用 XMLHttpRequest 来获得一个远程的 XML 文档的内容,responseXML 属性将会是一个由 XML 文档解析 ...

  9. MYSQL C API : mysql_real_escape_string 二进制数据存储

    #include <iostream> #include <string> #include <string.h> #include <mysql.h> ...

随机推荐

  1. 引用计数的cocos2dx对象内存管理和直接new/delete box2d对象内存管理冲突的解决方法

    转载请注明: http://blog.csdn.net/herm_lib/article/details/9316601 项目中用到了cocos2dx和box2d,cocos2dx的内存是基于引用计数 ...

  2. .NET:负载平衡的主意事项

    允许局域网发现和共享. 设置固定IP. 网站的IP设置为“全部未分配”. 注意:如果停止IIS的话,不会对负载平衡有影响,负载还是会分配停止了的IIS所在在的电脑,只有停止服务器了,负载不会再分配给停 ...

  3. 打造android万能上拉下拉刷新框架——XRefreshView (二)

    打造Android万能上拉下拉刷新框架--XRefreshView(一) 打造Android万能上拉下拉刷新框架--XRefreshView(三) 一.前言 自从上次发表了打造android万能上拉下 ...

  4. 解决HUE报错MultipleObjectsReturned: get() returned more than one Document2 -- it returned 2!

    表现:界面上报错:,刚登陆进去就能看到,点击执行也会出现.日志里报: Traceback (most recent call last): File "/home/work/hue-3.10 ...

  5. 在pycharm中进行nosetests并输出测试报告

    1.首先配置

  6. 用指令来构建IIS7

    工作上要部署iis7+net4.0环境,发现30多台机子都没有用装有IIS7镜像来安装,都必须自己手动. 作为程序猿,真要一台台装的话,就真对不起自己的职业.于是想到用bat来执行任务,找到了安装II ...

  7. SPSS19.0实战之多元线性回归

    线性回归数据来自于国泰安数据服务中心的经济研究数据库.网址:http://www.gtarsc.com/p/sq/.数据名称为:全国各地区能源消耗量与产量,该数据的年度标识为2006年,地区包括我国3 ...

  8. CUDA使用Event进行程序计时

    GPGPU是众核设备,包含大量的计算单元,实现超高速的并行. 使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时. 当然,每种编程语言基本都提供了获取系统时间的函数 ...

  9. jquery使用jsonp进行跨域调用

    关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用 首先介绍下$.ajax的参数 type:请求方式 GET/ ...

  10. Kettle中txt类型数据源作为输入需要注意的地方

    文本类型在kettle中作为数据源的时候,需要注意的几点,ktr的机构如下图 1:txt文本的格式 2:文本输入控件的设置 --2.1:选择文件所在物理位置 --2.2:设置分隔符,注意头部数量去掉, ...