根据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