ArrayBufferをマルチパートポストで使用する必要があるbase64文字列に変換するには、効率的な(ネイティブで読み込まれた)方法が必要です。ArrayBufferからbase64にエンコードされた文字列
答えて
function _arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[ i ]);
}
return window.btoa(binary);
}
ですが、ネイティブではない実装はより高速です。
ES6でvar base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
、構文は少し簡単です::https://gist.github.com/958841 はこれが私のために正常に動作http://jsperf.com/encoding-xhr-image-data/6
を参照してください、コメントで指摘したよう
let base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
、この方法は生じ得ますArrayBufferが大きい場合、一部のブラウザでランタイムエラーが発生する。正確なサイズ制限は、どの場合でも実装に依存します。
function _arrayBufferToBase64(uarr) {
var strings = [], chunksize = 0xffff;
var len = uarr.length;
for (var i = 0; i * chunksize < len; i++){
strings.push(String.fromCharCode.apply(null, uarr.subarray(i * chunksize, (i + 1) * chunksize)));
}
return strings.join("");
}
これは、あなたが文字列
何が間違っていますか? – RouR
この関数は何をするのでしょうか?https://jsfiddle.net/as9t9ebf/ –
からアンパックアーカイブのJSZipを使用する場合は、このための私の推薦は、彼らがすべて正しくArrayBuffer
年代をコードしないネイティブbtoa
としての戦略を、使用しないことです、良いです...
rewrite the DOMs atob() and btoa()
DOMStringsは、ほとんどのブラウザは、Unicode文字列にwindow.btoa呼び出しでCHARACの原因となります、16ビットでエンコードされた文字列であるので、 ter Out Of Range例外:文字が8ビットASCIIエンコード文字の範囲を超えています。
私はこの正確なエラーに遭遇したことはありませんが、ArrayBuffer
の多くがエンコードしようとしたことが間違ってエンコードされています。
MDNの推奨または要点を使用します。
別の非同期の方法ブロブとFileReaderのを使用するがあります。
私はパフォーマンスをテストしませんでした。しかし、それは考え方の違いです。
function arrayBufferToBase64(buffer, callback) {
var blob = new Blob([buffer],{type:'application/octet-binary'});
var reader = new FileReader();
reader.onload = function(evt){
var dataurl = evt.target.result;
callback(dataurl.substr(dataurl.indexOf(',')+1));
};
reader.readAsDataURL(blob);
}
//example:
var buf = new Uint8Array([11,22,33]);
arrayBufferToBase64(buf, console.log.bind(console)); //"CxYh"
私はこれを使用して私に役立ちます。
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[ i ]);
}
return window.btoa(binary);
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
安全ではありません。@chemoishの回答 – Kugel
あなたはArray.prototype.slice
を使用してArrayBuffer
から通常の配列を導き出すことができます。 Array.prototype.map
のような関数を使用してバイトを文字に変換し、join
を一緒に文字列に変換します。
function arrayBufferToBase64(ab){
var dView = new Uint8Array(ab); //Get a byte view
var arr = Array.prototype.slice.call(dView); //Create a normal array
var arr1 = arr.map(function(item){
return String.fromCharCode(item); //Convert
});
return window.btoa(arr1.join('')); //Form a string
}
この方法は、文字列の連結が実行されていないため、高速です。
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
を参照してください。 @chemoishの回答 – Kugel
以下は再び
arrayToBase64String(a) {
return btoa(String.fromCharCode(...a));
}
base64StringToArray(s) {
let asciiString = atob(s);
return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}
をBase64でStringにUint8Arrayを変換するため2シンプルな機能のものがあります。それは短い好きな人のために
- 1. base64でエンコードされた文字列のQRコード2
- 2. ロードBase64でエンコードされたイメージの文字列JLabelの
- 3. Marker Base64でエンコードされた文字列を使用する
- 4. PHPはbase64でエンコードされたデータ文字列からPDFファイルを取得
- 5. python base64が文字列にエンコードする
- 6. base64でエンコードされた文字列をJavaバイト配列に変換する
- 7. XmlSerializerを、base64でエンコード文字列のメンバー
- 8. Base64でエンコードされた文字列に改行を追加します。
- 9. PythonのUnicode文字列をBase64でエンコードするbase64 2.7
- 10. HttpGet経由で長い文字列(Base64でエンコードされた画像)を送信
- 11. ファイルとしてbase64でエンコードされた文字列を格納します。
- 12. Androidでbase64でエンコードされた文字列を連結する方法は?
- 13. aASP.NetでBase64でエンコードされたクエリ文字列を送信する問題
- 14. ファイルアップロードRailsを使ってPaperClipのBase64でエンコードされた文字列
- 15. PhoneGapスクリーンショットのプラグインは、Base64でエンコードされた文字列(iPhone)を返します
- 16. 投稿時にbase64でエンコードされた文字列から空白を削除します
- 17. URLエンコードされた文字列
- 18. Compass/SASSのURL-またはBase64-エンコード文字列
- 19. エンコードされたバイトから文字列データを取得
- 20. AndroidでBase64で文字列をエンコードするには?
- 21. 複数のBase64エンコードされたパラメータがURLクエリ文字列に1として表示される
- 22. ArrayBufferからバイナリ文字列を取得するには?
- 23. バイト文字列をbase64でエンコードされた文字列に変換します(出力はバイト文字列ではありません)
- 24. バイト配列をbase64でエンコードされたイメージに読み込む
- 25. コンバートBase64文字列
- 26. Androidのbase64文字列内のビットマップオブジェクトをエンコードしてデコードする
- 27. イメージをfirebaseにbase64でエンコードされた文字列として保存するには
- 28. 空の文字列はゼロバイト長の有効なbase64エンコードされたデータですか?
- 29. Base64でエンコードされた文字列をJavaサーバーの画像ファイルに変換します。
- 30. Base64でエンコードされた文字列をファイルに(Ruby on Rails) - 未定義のメソッド `unpack 'エラー
リンクから非ネイティブの実装を試してみましたが、上記のループコードが1秒しかかからずに1Mサイズのバッファを変換するのに1分30秒かかりました。 – cshu
私はこのアプローチの単純さが気に入っていますが、すべての文字列の連結はコストがかかることがあります。それは、文字の配列を構築するように見え、最後に 'join()'を実行すると、Firefox、IE、Safariでかなり速くなります(ただし、Chromeではかなり遅くなります):http://jsperf.com/tobase64-実装 – JLRishe
配列バッファからbase64への変換にこの関数を使用していますが、配列バッファを取得できません。私は_base64ToArrayBuffer()関数をここでwrritenしている:http://codeshare.io/PT4pbしかし、それは私にエラーが表示されます: 'atob'を 'Window'で実行できませんでした:デコードする文字列が正しくエンコードされていません。 – bawejakunal