用string訪問二進位制資料

2021-08-15 06:19:44 字數 1395 閱讀 8943

stl的string很強大,用起來也感覺很舒服,這段時間在**中涉及到了用string訪問二進位制資料的問題,這裡記錄一下,以供以後參考。

首先提一下stl中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 #include using namespace std;

int main()

; string str1(data),

str2(data,sizeof(data))

; cout<

執行效果: ab

2abcd 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()來操作)。

mysql訪問二進位制資料

1 訪問二進位制資料可行性分析 考慮1 函式mysql query儲存二進位制資料,可行不?也行也不行,比如sql語句中恰好含有 0 而mysql query又是以 0 表示sql語句結束,這樣sql語句被截斷就不完整了。檢視幫助發現還有乙個mysql real query,最妙的是它不是使用 0 ...

mysql訪問二進位制資料

1 訪問二進位制資料可行性分析 考慮1 函式mysql query儲存二進位制資料,可行不?也行也不行,比如sql語句中恰好含有 0 而mysql query又是以 0 表示sql語句結束,這樣sql語句被截斷就不完整了。檢視幫助發現還有乙個mysql real query,最妙的是它不是使用 0 ...

python numpy二進位制訪問

根據資料特點,調整儲存占用的空間大小。因為陣列中全是0和1,所以用單位元組 np.int8 儲存。如果是浮點或其他格式,可以用其他型別。存 f open c,ab d1 np.array 0,0,1 dtype np.int8 f.write d1 3 d2 np.array 0,1,1 dtype...