Преобразование строки base64 в ArrayBuffer
Мне нужно преобразовать строку кодирования base64 в ArrayBuffer. Строки base64 являются пользовательским вводом, они будут скопированы и вставлены из электронной почты, поэтому их нет при загрузке страницы. Я хотел бы сделать это в javascript, не делая ajax-вызов на сервер, если это возможно.
Я нашел эти ссылки интересными, но они не помогли мне:
ArrayBuffer в кодированную строку base64
Речь идет об обратном преобразовании, из ArrayBuffer в base64, а не наоборот
Http://jsperf.com/json-vs-base64/2
Это выглядит хорошо, но я не могу понять, как использовать код.
Есть ли простой (возможно, родной) способ сделать преобразование? Спасибо
6 ответов:
Попробуйте это:
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; }
Goran.it ' s ответ не работает из-за проблемы unicode в javascript - https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding.
Функция
В итоге я воспользовался функцией, приведенной в блоге Даниэля Герреро: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/Указана на ссылке github: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
Используйте эти строкиvar uintArray = Base64Binary.decode(base64_string); var byteArray = Base64Binary.decodeArrayBuffer(base64_string);
Используя TypedArray.из :
Uint8Array.from(atob(base64_string), c => c.charCodeAt(0))
Производительность для сравнения с версией цикла for Goran.it отвечай.
Только что нашел base64-arraybuffer, небольшой пакет npm с невероятно высоким уровнем использования, 5M загрузок в прошлом месяце (2017-08).
Https://www.npmjs.com/package/base64-arraybuffer
Для тех, кто ищет что-то из лучших стандартных решений, это может быть именно так.
Javascript-прекрасная среда разработки, поэтому кажется странным, что она не дает решения этой небольшой проблемы. Решения, предлагаемые в других разделах этой страницы, потенциально медленны. Вот мое решение. Он использует встроенную функциональность, которая декодирует URL-адреса изображений и звуковых данных base64.
var req = new XMLHttpRequest; req.open('GET', "data:application/octet;base64," + base64Data); req.responseType = 'arraybuffer'; req.onload = function fileLoaded(e) { var byteArray = new Int8Array(e.target.response); // var shortArray = new Int16Array(e.target.response); // var unsignedShortArray = new Int16Array(e.target.response); // etc. } req.send();
Запрос на отправку завершается неудачей, если строка base 65 плохо сформирована.
Тип mime (application / octet), вероятно, не нужен.
Проверено в chrome. Должен работать в другом браузеры.
new TextEncoder().encode("base64").buffer // is ArrayBuffer new TextEncoder().encode("base64") // is Uint8Array
На самом деле, вы можете кодировать/декодировать любую строку, а не только строку base64.
MDN: https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder
Могу ли я использовать... https://caniuse.com/#feat=textencoder