0

メモリに文字列があり、それを を使用して Web サービスに送信したい状況では、BackgroundUploaderそれをディスクに書き込む (したがって、一時ファイルのクリーンアップを処理する) 必要はありません。

createUploadFromStreamAsyncはそれがありますが、文字列から必要なものを作成する最もパフォーマンスの高い方法は何だろうと思いますIInputStream.

私が最初に考えたのは、それをIBufferusingに変換し、それをCryptographicBuffer::convertStringToBinaryに書き込んでInMemoryRandomAccessStream、そこから IInputStream を取得することでした。つまり、String -> IBuffer -> InMemoryRandomAccessStream -> IInputStream です。かなり面倒…

達成するための 2 番目の方法は、sth like を実行することですnew Blob(myString.split('')).msDetachStream().getInputStreamAt(0)。これはもちろん、多くのネイティブ呼び出しを使用せず、同じ数のステップを持ちます。つまり、文字列 -> 配列 -> Blob -> IInputStream です。

この変換を処理するためのアプローチは何ですか?

4

1 に答える 1

0

このシナリオで CryptographicBuffers を使用してはならない方法 1 を置き換える、テスト済みの動作中のバージョンは次のとおりです。

                    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)

ストリームのバイト順とエンコーディングは、使用方法によって大きな違いを生む可能性があります。実際、2 番目の方法では、エンコード形式によっては、別の方法で文字列を分割する必要がある場合があります。

于 2016-02-22T14:33:54.313 に答える