2014-10-28 40 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到字符串

这当然要快得多 - 您的分配与读取的字节数相同,函数调用的次数也是如此。