C std string能否儲存二進位制字元

2021-07-27 21:26:36 字數 1839 閱讀 3301

1. std::string 是否可以包含二進位制字元,答案是能

std::string ss = std::string("***") + '\2' + "yyy" + '\11' + "zzz";

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]";

// len=[11],data=[***yyy  zzz]

2. std::string 是否可以包含字元0,答案是能

std::string ss = std::string("***") + '\0' + "yyy" + '\0' + "zzz";

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]";

// len=[11],data=[***yyyzzz]

3. 如何從char *構造std::string

3.1 整個字串

const char * cc = "***yyyzzz";

std::string ss(cc);

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]" << std::endl;

// len=[9],data=[***yyyzzz]

3.2 指定長度子串

const char * cc = "***yyyzzz";

std::string ss(cc, 3);

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]" << std::endl;

// len=[3],data=[***]

3.3 指定起始位置長度子串

const char * cc = "***yyyzzz";

std::string ss(cc + 3, 3);

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]" << std::endl;

// len=[3],data=[yyy]

注意, 如果char *中包含'\0'字元, 那麼到'\0'後面的內容會被丟棄, 比如

const char * cc = "***yyy\0zzz";

std::string ss(cc);

std::cout << "len=[" << ss.size() << "],data=[" << ss << "]" << std::endl;

// len=[6],data=[***yyy]

因為const char *包含'\0'字元, 後面的"zzz"被丟棄了。總結一句話如果char *裡面包含'\0'字元,那麼'\0'之後的內容會被丟棄。

因此如果你試圖從buffer

unsigned char * buffer = ....

建立std::string物件採用buffer裡面的乙個字串 (offset, length)

std::string ss(buffer + offset, length);

如果在buffer + offset開始的length範圍內存在乙個'\0'字元; 那麼ss可能不是你想要的結果, ss只包含從buffer+offset開始到'\0'字元為止, '\0'以後的字元儘管它還在length之內, 也會被丟棄。

c++之所以這樣做是基於對char *規範的理解; char *的規範遇到'\0'表示char *結束; 也就是說'\0'之後的資料已經不屬於char *的範圍;因此任何試圖基於char *構造的std::string物件都不應該去訪問char *之外的資料; 這也就像strcpy和memcpy的區別一樣。

InServ T級儲存系統能否挑戰傳統儲存架構?

傳統儲存架構和業務之間似乎已經陷入一種瓶頸的怪圈。當儲存系統不能夠滿足業務需求時,就靠通過增加控制器處理能力和記憶體來滿足業務的需求 經過一段時間後,儲存系統又不能滿足業務需求時,又是靠通過增加處理能力和記憶體來達到目的。如此迴圈下去,最後陷入瓶頸的怪圈。傳統儲存架構的侷限性也促使儲存廠商們去思考如...

IT巨頭互掐雲儲存 Dropbox能否一馬當先

微軟推出skydrive多平台應用 與dropbox競爭 os x lion ios windows phone 等,這些不同客戶端對應的功能都極為相似。當然,如果你從來沒有嘗試過,建議還是安裝體驗下。只需要乙個windows live id,執行後,就可以在不同的電腦上使用相同的賬號登入到skyd...

雲儲存能否成為資料安全靈藥?幾個角度全方位剖析

51cto.com快譯 雲儲存已經成為目前最為流行的資料保護手段。從個人到各類企業都在嘗試利用雲儲存服務保護檔案,同時藉此實現隨時隨地訪問能力。不過在經過數次雲服務 商資料洩露事故之後,雲儲存的資料安全性亦成為使用者面臨的切實難題。那麼,我們是否該繼續依賴雲儲存以實現資料安全?雲安全漏洞其實與雲無關...