Мне нужен эффективный (для чтения на родном) способ преобразования ArrayBuffer
строки в base64, которую нужно использовать в составном сообщении.
203
Мне нужен эффективный (для чтения на родном) способ преобразования 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 );
}
но не родные реализации быстрее, например https://gist.github.com/958841 см. http://jsperf.com/encoding-xhr-image-data/6
join()
их окончание значительно быстрее в Firefox, IE и Safari (но в Chrome - намного медленнее): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Это прекрасно работает для меня:
В ES6 синтаксис немного проще:
Как указано в комментариях, этот метод может привести к ошибке во время выполнения в некоторых браузерах, когда
ArrayBuffer
он большой. Точный предел размера зависит от реализации в любом случае.источник
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
безопасен для символов в диапазоне кодов от 0 до 255, как и здесь (подумайте о 8 вUint8Array
).Для тех, кто любит это коротко, вот другое использование,
Array.reduce
которое не вызовет переполнение стека:источник
<amount of Bytes in the buffer>
новые строки.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Существует еще один асинхронный способ использования Blob и FileReader.
Я не проверял производительность. Но это другой способ мышления.
источник
dataurl.split(',', 2)[1]
вместоdataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
теоретически может вернуть процент закодированного dataURI (и, похоже, это действительно так в jsdom )split
лучше, чемsubstring
?Я использовал это и работает для меня.
источник
Моя рекомендация для этого - НЕ использовать нативные
btoa
стратегии, так как они неправильно кодируют всеArrayBuffer
…переписать DOMs atob () и btoa ()
Хотя я никогда не сталкивался с этой точной ошибкой, я обнаружил, что многие из кодов, которые
ArrayBuffer
я пытался кодировать, были закодированы неправильно.Я бы использовал рекомендацию MDN или суть.
источник
btoa
не работает на String, но OP спрашиваетArrayBuffer
.источник
Ниже приведены две простые функции для преобразования Uint8Array в Base64 String и обратно
источник
function
ключевое слово, и оно должно работать в современном браузере.Вы можете получить нормальный массив с
ArrayBuffer
помощьюArray.prototype.slice
. Используйте функцию вродеArray.prototype.map
для преобразования байтов в символы иjoin
их вместе в строку формата.Этот метод работает быстрее, так как в нем нет конкатенации строк.
источник
В OP не указана «Запущенная среда», но если вы используете Node.JS, существует очень простой способ сделать это.
Согласование с официальными документами Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Кроме того, если вы работаете под Angular, например, Buffer Class также будет доступен в среде браузера.
источник
Javascript
. Поэтому я обновил свой ответ, чтобы сделать его более лаконичным. Я думаю, что это важный ответ, потому что я искал, как это сделать, и не смог найти лучший ответ на проблему.Со своей стороны, используя навигатор Chrome, мне пришлось использовать DataView () для чтения arrayBuffer
источник
Это лучше, если вы используете JSZip для распаковки архива из строки
источник