根據MSDN,DataReader的::的ReadBytes存在,是你在找什麼:http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.readbytes
它需要一個Platform::Array<unsigned char>
作爲參數,這大概你會初始化使用前綴長度,這在返回時,將包含你的字節。從那裏開始構建所需的std::string
是一個單調乏味而又簡單的過程。
基本用法會是這個樣子(道歉,在Mac上的那一刻,如此精確的語法可能有點關閉):
auto len = reader->ReadInt16();
auto data = ref new Platform::Array<uint8>(len);
reader->ReadBytes(data);
// now data has the bytes you need, and you can make a string with it
注意,上面的代碼是不生產 -準備好了 - 這肯定有可能reader
沒有足夠的數據緩存,所以你需要reader.LoadAsync(len)
並創建一個繼續處理數據的時間。儘管如此,希望這足以讓你走。
編輯:
只注意到你身邊的問題。簡單的回答是,是的,一次讀取一個字節會慢得多,因爲它的工作量更大。
長的答覆:考慮到各字節發生的事情:
- 一個函數調用發生 - 棧幀分配
- 從緩存中讀取一個字節的一些邏輯發生
- 該函數返回 - 堆棧幀被彈出,結果被按下,控制返回
- 您取出該字節,並將其推入
std::string
,偶爾會導致動態重新分配(除非您已經爲str.resize(len)
,即 )
在發生的所有事情中,動態重新分配是真正的性能殺手。話雖如此,如果你有很多的字節,函數調用的工作將主宰閱讀一個字節的工作。現在
,可以考慮當你讀到的所有字節一次會發生什麼:
- 一個函數調用發生 - 棧幀,推結果數組
- (在幸福路,所有請求的數據在那裏)的memcpy從內部緩衝到您預先分配的數組
- 回報
- 的memcpy到字符串
這當然要快得多 - 您的分配與讀取的字節數相同,函數調用的次數也是如此。
來源
2014-10-30 22:20:12
Ben