当前位置: 首页 > news >正文

用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

从运行结果不难发现,采用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

 

 

 

 

 

转载于:https://www.cnblogs.com/huhu0013/p/3919578.html

相关文章:

  • struct{0}二
  • fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
  • DNGuard V1.0 for Win98, WinMe 的运行库发布
  • [Quest ActiveRoles Management Shell for Active Directory] QADProxyAddress命令相关的bug。
  • cursor:hand 与 cursor:pointer 的区别
  • win7中USB音箱没有声音解决的方法
  • 绘制思维导图的注意事项有哪些?
  • Sql去重语句
  • js算法-归并排序(merge_sort)
  • sessionStorage和localStorage
  • 昼猫笔记 JavaScript -- 面向对象(I)
  • 在Activity中为什么要用managedQuery()
  • uoj#352. 新年的五维几何(概率期望+爆搜)
  • 自己编写的一个Javascript正则表达式对象
  • 几张关于IT业人才成长的统计图片
  • 5、React组件事件详解
  • Angular2开发踩坑系列-生产环境编译
  • Docker下部署自己的LNMP工作环境
  • input实现文字超出省略号功能
  • LeetCode29.两数相除 JavaScript
  • leetcode388. Longest Absolute File Path
  • MaxCompute访问TableStore(OTS) 数据
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue-router 实现分析
  • Vue--数据传输
  • vue学习系列(二)vue-cli
  • Wamp集成环境 添加PHP的新版本
  • 大主子表关联的性能优化方法
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 为什么要用IPython/Jupyter?
  • 智能网联汽车信息安全
  • 转载:[译] 内容加速黑科技趣谈
  • 阿里云服务器如何修改远程端口?
  • 如何在招聘中考核.NET架构师
  • 如何正确理解,内页权重高于首页?
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (14)Hive调优——合并小文件
  • (3)nginx 配置(nginx.conf)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) ns2/nam与nam实现相关的文件
  • .bat批处理出现中文乱码的情况
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET4.0并行计算技术基础(1)
  • .Net6使用WebSocket与前端进行通信
  • @hook扩展分析
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20170713] 无法访问SQL Server
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林