国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現string存取二進制數據的方法

2020-05-23 14:20:34
字體:
來源:轉載
供稿:網友

本文實例講述了C++實現string存取二進制數據的方法,分享給大家供大家參考。具體方法分析如下:

一般來說,STL的string很強大,用起來也感覺很舒服,這段時間在代碼中涉及到了用string存取二進制數據的問題,這里記錄一下,以供以后參考。

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

在數據傳輸中,二進制數據的buffer一般用系統預設的大數組進行存儲,而不是STL的string等,比如:

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


因為二進制數據中可能會包含0x00(即:'/0'),剛好是字符串結束標志……

如果我們的代碼是如下寫的:

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


我只能說,這個處理字符串應該沒問題,如果是二進制的話,會被string的構造函數給截斷一部分,導致strData和data的數據不一致。

其實一個簡單的demo就可以說明問題,比如如下代碼:



 

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

?運行效果如下:

 

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

?從運行結果不難發現,采用str2的那種方式就可以保證string中的數據和原始data中的數據一致。這是因為采用不同的構造函數不同,導致結構完全不一樣,這個可以從我前面給出的網址中去查看具體的構造函數說明加以理解。這里我們回到前面的那個問題,如果想保存二進制的話,我們應該如下操作:

 

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

?如果要取出數據的話,也簡單(這個還以socket數據收發為例):

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

這里的strData.c_str()即為數據,strData.length()即為要發送的數據長度(當然也可以使用strData.size()來操作)。

當然,我們這里用string來存取二進制數據,也只是為了操作方便,感覺這個不是太好,應該會有很多朋友不提倡這種做法的,這里提供一個思路,大家覺得好就采用,覺得不好就一笑了之,呵呵……

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石棉县| 保靖县| 阜城县| 隆尧县| 高雄市| 正镶白旗| 合山市| 绥宁县| 木兰县| 松潘县| 济南市| 习水县| 台南县| 广南县| 黄龙县| 香格里拉县| 卓资县| 股票| 甘孜县| 库尔勒市| 桃江县| 万荣县| 天等县| 永靖县| 亳州市| 广元市| 曲麻莱县| 格尔木市| 汶川县| 安丘市| 东阿县| 商丘市| 开封市| 华安县| 衡水市| 富宁县| 田东县| 出国| 临猗县| 格尔木市| 客服|