Преобразование строки base64 в ArrayBuffer


Мне нужно преобразовать строку кодирования base64 в ArrayBuffer. Строки base64 являются пользовательским вводом, они будут скопированы и вставлены из электронной почты, поэтому их нет при загрузке страницы. Я хотел бы сделать это в javascript, не делая ajax-вызов на сервер, если это возможно.

Я нашел эти ссылки интересными, но они не помогли мне:

ArrayBuffer в кодированную строку base64

Речь идет об обратном преобразовании, из ArrayBuffer в base64, а не наоборот

Http://jsperf.com/json-vs-base64/2

Это выглядит хорошо, но я не могу понять, как использовать код.

Есть ли простой (возможно, родной) способ сделать преобразование? Спасибо

6 55

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

Полифилл: https://github.com/inexorabletash/text-encoding