用string存取二进制数据
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存取二进制数据的更多相关文章
- Sword redis存取二进制数据
#include "hiredis/hiredis.h" /* redis头文件 */ #include <stdio.h> #include <stdlib.h ...
- [Swift通天遁地]四、网络和线程-(5)解析网络请求数据:String(字符串)、Data(二进制数据)和JSON数据
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- sqlite3的图片的(二进制数据)存取操作
sqlite3的图片的(二进制数据)存取操作 前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...
- Java/Android 二进制数据与String互转
将经过加密的二进制数据保存到本地的方法 byte[] src = new byte[] { 122,-69, -17, 92, -76, 52, -21, -87, -10, 105, 76, -75 ...
- 【python】3.x,string与bytes的区别(文本,二进制数据)
Python 3对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示, 二进制数据则由bytes类型表示. 不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也 ...
- 数据库中用varbinary存储二进制数据
问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...
- IO流-文本IO\读写二进制数据
文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读 ...
- 详细解读XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
本文主要参考:MDN 分析并操作 responseXML属性 如果你使用 XMLHttpRequest 来获得一个远程的 XML 文档的内容,responseXML 属性将会是一个由 XML 文档解析 ...
- MYSQL C API : mysql_real_escape_string 二进制数据存储
#include <iostream> #include <string> #include <string.h> #include <mysql.h> ...
随机推荐
- CSDN 四川大学线下编程比赛第一题:数字填充
题目意思: http://student.csdn.net/mcs/programming_challenges peter喜欢玩数字游戏,但数独这种游戏对他来说太简单了,于是他准备玩一个难的游戏. ...
- CMSIS-SVD Schema File Ver. 1.1 (draft)
http://www.keil.com/pack/doc/cmsis/svd/html/group__schema__1__1__gr.html <?xml version="1.0& ...
- Druid 连接泄漏监测
当程序存在缺陷时,申请的连接忘记关闭,这时候,就存在连接泄漏了.Druid提供了RemoveAbandanded相关配置,用来关闭长时间不使用的连接.例如: 配置 <bean id=" ...
- Druid 配置_StatFilter
Druid内置提供一个StatFilter,用于统计监控信息. 1. 别名配置 StatFilter的别名是stat,这个别名映射配置信息保存在druid-xxx.jar!/META-INF/drui ...
- Source Insight常用快捷键及注释快捷键设置
转:http://blog.csdn.net/tlaff/article/details/6536610 在使用SI过程中,我根据自己的使用习惯修改了它的默认快捷键,并且在配置文件中添加了一些人性化功 ...
- 前端必备工具-IETest
浏览器兼容性可以检查IE5.5到10 ,一直还用IE6来测试,因为觉得这样错误显示更真实,但是现在不换也不行,很多网页都已经不支持ie6了,实在受不了,果断升级,而且这个也是升级了才能用的,既然很多前 ...
- 集成SVN源码管理和Mantis缺陷跟踪
集成SVN源码管理和Mantis缺陷跟踪 (windows) 要集成Mantis和SVN,需要几个工具:SVN客户端,TortoiseSVN,下载地址: http://tortoisesvn.net/ ...
- hdu 1398
题目大意:输入是一个整数.输出他的拆分数(即拆分的方案数),本题与1028最大的不同之处就在于他的面额只能是整数的平方 代码如下: /* * 1398_1.cpp * * Created on: 20 ...
- iOS开源项目:asi-http-request
使用CFNetwork实现的http库,能同时在iphone和macos下使用:http://allseeing-i.com/ASIHTTPRequest/ 他提供以下功能: 向服务器发送或者从服务器 ...
- 视频运行库AVICAP32.DLL说明收藏
视频运行库AVICAP32.DLL说明收藏2008-09-28 09:04 // ----------------------------------------------------------- ...