C++完成string存取二進制數據的辦法。本站提示廣大學習愛好者:(C++完成string存取二進制數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C++完成string存取二進制數據的辦法正文
本文實例講述了C++完成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來存取二進制數據,也只是為了操作便利,感到這個不是太好,應當會有許多同伙不倡導這類做法的,這裡供給一個思緒,年夜家認為好就采取,認為欠好就一笑了之,呵呵……
願望本文所述對年夜家的C++法式設計有所贊助。