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

2020-01-06 13:07:21刘景俊

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

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

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

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

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


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

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

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


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

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



 

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

?运行效果如下:

 

  1. Ab   
  2. 2   
  3. Abcd   
  4. 5  

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

 

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