如果我在内存中有一个字符串并希望使用BackgroundUploader
将其发送到Web服务,我希望避免将其写入磁盘(从而处理临时文件的清理)。 / p>
现在有createUploadFromStreamAsync
,但我想知道从字符串创建所需IInputStream
的最高效方法是什么。
我想到的第一件事就是使用IBuffer
将其转换为CryptographicBuffer::convertStringToBinary
,将其写入InMemoryRandomAccessStream
并从那里获取IInputStream。所以它是字符串 - > IBuffer - > InMemoryRandomAccessStream - > IInputStream。相当麻烦......
要实现的第二种方法是做new Blob(myString.split('')).msDetachStream().getInputStreamAt(0)
,这当然不会使用尽可能多的本机调用并具有相同数量的步骤。即字符串 - >数组 - > Blob - > IInputStream。
您处理此转换的方法是什么?
答案 0 :(得分:0)
在这种情况下,替换方法1的测试和工作版本不应该使用CryptographicBuffers:
var randomAccessStream = new Windows.Storage.Streams.InMemoryRandomAccessStream();
var dataWriter = new Windows.Storage.Streams.DataWriter(randomAccessStream);
dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf8;
dataWriter.byteOrder = Windows.Storage.Streams.ByteOrder.littleEndian;
dataWriter.writeString(myString);
dataWriter.storeAsync().then(function () {
return dataWriter.flushAsync();
}).then(function () {
var stream = dataWriter.detachStream();
stream.seek(0);
dataWriter.close();
stream;
});
方法2的测试和工作版本很简单:new Blob([new Uint8Array(Array.from(myString))])。msDetachStream()。getInputStreamAt(0)
根据您的使用方式,流字节顺序和编码可能会产生显着差异。实际上,第二种方法可能需要使用另一种方法来分割字符串,具体取决于编码格式。