2014-02-15 5 views
40

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

Я нашел эти ссылки интересны, но они didt'n мне помочь:

ArrayBuffer to base64 encoded string

речь идет о противоположной конверсии от ArrayBuffer в base64, а не наоборот

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

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

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

ответ

69

Попробуйте это: ответ

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; 
} 
+2

Пожалуйста, объясните мне, что на самом деле происходит здесь. – piechuckerr

+0

Ну, это довольно просто, сначала мы декодируем строку base64 (atob), затем создаем новый массив из 8-разрядных целых без знака с той же длиной, что и декодированная строка. После этого мы перебираем строку и заполняем массив значением Unicode каждого символа в строке. –

+1

Почему неподписанный 8-бит? любая конкретная причина? – piechuckerr

15

Goran.it не работает из-за проблемы юникода в 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); 
+0

Этот метод в 2 раза быстрее, чем при использовании atob. – xiaoyu2er

10

Использование TypedArray.from:

Uint8Array.from(atob(base64_string), c => c.charCodeAt(0)) 

Показатели эффективности ared с версией ответа Goran.it для цикла.

+1

Кому нравится такой лайнер, имейте в виду, что 'Uint8Array.from' по-прежнему мало совместим с некоторыми браузерами. – IzumiSy

+0

Просьба не рекомендовать atob или btoa: https: //developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding – Kugel

+0

Компилятор rails не может обрабатывать эту строку и не работает с 'ExecJS :: RuntimeError: SyntaxError: Неожиданный токен: operator (>)'; (рельсы 5) –

5

Только что найденный base64-arraybuffer, небольшой пакет npm с невероятно высоким уровнем использования, 5M загрузок в прошлом месяце (2017-08).

https://www.npmjs.com/package/base64-arraybuffer

Для тех, кто ищет что-то из лучшего стандартного раствора, это может быть.

Смежные вопросы