2014-10-28 53 views
1

我有ANSI字符串流。它以字節長度爲前綴。我怎樣才能將它讀入std::string從DataReader高效地讀取一些字節?

喜歡的東西:

short len = reader.readInt16(); 
char[] result = reader.readBytes(len); // ??? 
std::string str = std::copy(result, result + len); 

但沒有方法readBytes(int)

旁邊的問題:它是否緩慢閱讀readByte()DataReader一次一個字節?

回答

3

根據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)並創建一個繼續處理數據的時間。儘管如此,希望這足以讓你走。

編輯

只注意到你身邊的問題。簡單的回答是,是的,一次讀取一個字節會慢得多,因爲它的工作量更大。

長的答覆:考慮到各字節發生的事情:

  1. 一個函數調用發生 - 棧幀分配
  2. 從緩存中讀取一個字節的一些邏輯發生
  3. 該函數返回 - 堆棧幀被彈出,結果被按下,控制返回
  4. 您取出該字節,並將其推入std::string,偶爾會導致動態重新分配(除非您已經爲str.resize(len),即

在發生的所有事情中,動態重新分配是真正的性能殺手。話雖如此,如果你有很多的字節,函數調用的工作將主宰閱讀一個字節的工作。現在

,可以考慮當你讀到的所有字節一次會發生什麼:

  1. 一個函數調用發生 - 棧幀,推結果數組
  2. (在幸福路,所有請求的數據在那裏)的memcpy從內部緩衝到您預先分配的數組
  3. 回報
  4. 的memcpy到字符串

這當然要快得多 - 您的分配與讀取的字節數相同,函數調用的次數也是如此。