我試圖用istringstream
從某個內存重新創建編碼的wstring
。內存佈局如下:使用istringstream處理可變長度的內存塊
- 1個字節表示wstring編碼的開始。任意這是'!'。
- n個字節以文本格式存儲字符串的字符長度,例如, 0X31,0x32,0x33將是「123」,即,123個字符的字符串
- 1個字節分離器(空格字符)
- n個字節,其是構成該串,其中的wchar_t的各自2個字節的wchars 。
例如,該字節序列:
21 36 20 66 00 6F 00 6F 00
是 「6 f.o.o.!」 (使用點來表示字符0)
我得到的只是一個char *指針(我們稱之爲pData
),以此編碼數據在其中的內存塊的開始。使用數據重建wstring(「foo」)的最佳方法是什麼,並且還會將指針移到編碼數據末尾的下一個字節?
我正在使用istringstream來允許我使用前綴字節,字符串長度和分隔符。之後,我可以計算讀取多少字節並使用流的read()
函數插入適當調整大小的wstring。 問題是,如何首先將此內存放入istringstream中? I 可能先嚐試構造一個字符串,然後將其傳遞到istringstream,例如,
std::string s((const char*)pData);
但這不起作用,因爲字符串在第一個空字節處被截斷。或者,我可以用字符串的其他構造函數來明確說明有多少字節使用:
std::string s((const char*)pData, len);
它的工作原理,但只有我知道什麼是len
事前。鑑於數據是可變長度的,這很棘手。
這似乎是一個真正可解決的問題。我的菜鳥狀態是否意味着我忽略了一個簡單的解決方案?或者我用整個字符串方法吠叫錯誤的樹?
沒有緩衝「對象」我很害怕,只是一個指向內存中的BLOB 。我得到了一個指向該內存開始的指針,我需要(重新)從它創建一個wstring。我不能真正終止任何事情,因爲空值是有效的數據(請參閱我的示例)。我有點知道它的大小,因爲它是用數據編碼的,儘管它是一個文本字符串。作爲一個人,我可以很容易地解析這些數據,但我正在努力想出一種在代碼中實現的優雅方式。如果您有任何具體的問題想要了解,請提出問題。 – WalderFrey 2010-02-19 14:26:21