首页 > 编程语言 >C++实现string存取二进制数据的方法

C++实现string存取二进制数据的方法

时间:2024-04-18 10:46:36浏览次数:19  
标签:string 二进制 数据 strData C++ length data

这篇文章主要介绍了C++实现string存取二进制数据的方法,针对STL中string的用法进行了较为详细的分析,需要的朋友可以参考下  

本文实例讲述了C++实现string存取二进制数据的方法,分享给大家供大家参考。具体方法分析如下:

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

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

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

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

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

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

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

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 #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; }

运行效果如下:

1 2 3 4 5 6 7 Ab   2   Abcd   5

从运行结果不难发现,采用str2的那种方式就可以保证string中的数据和原始data中的数据一致。这是因为采用不同的构造函数不同,导致结构完全不一样,这个可以从我前面给出的网址中去查看具体的构造函数说明加以理解。这里我们回到前面的那个问题,如果想保存二进制的话,我们应该如下操作:

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

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

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

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

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

希望本文所述对大家的C++程序设计有所帮助。

标签:string,二进制,数据,strData,C++,length,data
From: https://www.cnblogs.com/lidabo/p/18142977

相关文章

  • 【字符编码】c++编码格式及转换
    参考资料:字符编码笔记:ASCII,Unicode和UTF-8通俗易懂wstring和string的区别wstring和string是C++中的两种字符串类型,它们的主要区别在于字符编码和存储方式。字符编码:string使用单字节字符编码,通常使用ASCII编码或其扩展(如UTF-8)。wstring使用宽字符编码......
  • c++ std::string能否存储二进制字符以及'\0'字符?
    c++的字符串类std::string能否存储二进制字符以及字符'\0'?要解决这个问题,我们首先要了解c++的std::string的存储结构。(注意不同的平台下C++规范对std::string的实现不完全一致,例如sizeof(std::string)在linuxx64gcc-4.4下的输出是8,而在macgcc4.2下的输出是24;这篇文章以Li......
  • Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝
    一、前言之前就写过这个方案,当时做的是ffmpeg内核版本,由于ffmpeg内核解析都是代码实现,所以无缝切换非常完美,看不到丝毫的中间切换过程,看起来就像是在一个通道画面中。其实这种切换只能说是取巧办法,最佳的办法应该是公用一个openglwidget窗体,解码线程那边开两个,第二个解码线程打开......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......
  • C++排序问题
    冒泡排序若得到一个从小到大的数组例如:3527481角标:1234567就是角标1和角标2比,若1大于2,就交换位置,然后角标2和角标3比,若2大于3,就交换位置第一趟:3254718第二趟:2345178以此类推。。。。点击查看代码#include<bits/stdc++.h>usingnamespaces......
  • The request was rejected because the URL contained a potentially malicious Strin
    org.springframework.security.web.firewall.RequestRejectedException:TherequestwasrejectedbecausetheURLcontainedapotentiallymaliciousString"%2e"org.springframework.security.web.firewall.RequestRejectedException:Therequestwasrej......
  • [9] UE C++ Snake
    思维导图背景地图制作创建瓦片集角色素材GameMode功能游戏开始控制食物的生成食物生成池(性能优化)/**形参如果是一个引用,且没有添加const关键字,代表实参想要借助形参修改值*param是否指定生成时候的地址*/voidASnakeGameModeBase::SpawnFood(FVector&Spaw......
  • 编写ROS2(C++语言)软件包的步骤
    0简介介绍编写ROS2(C++语言)软件包的步骤;0.1前置条件参考x.1,和x.2,安装ROS2和编译工具;1创建ROS2软件包以下的指令,创建一个名为mtuav-sns-radar-ros2的ROS2软件包,使用ament_cmake作为构建系统,许可证类型为Apache-2.0,并包含一个名为radar_node的节点;mkdir-p~/ros2_ws/srccd......
  • 深度解读《深度探索C++对象模型》之拷贝构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文。写作不易,请有心人到我的公众号上点点赞支持一下,增加一下热度,也好让更多的人能看到,公众号里有完整的文章列表可供阅读。有以下三种情况,一个类对象的初始......
  • C++的介绍及与C语言的对比
    目录一.C语言与C++二.面向过程和面向对象三.C++的应用领域四.Cpp的运行和标准1.编译型语言和解释型语言2.C++的运行过程及相关文件解释一.C语言与C++C语言C语言是为开发Unix系统而创建的语言,它是一种面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它贴近硬件,运行......