wake-up-neo.com

Konvertieren Sie die base64-Zeichenfolge in ArrayBuffer

Ich muss eine base64-Codierungszeichenfolge in einen ArrayBuffer ..__ konvertieren. Die base64-Zeichenfolgen sind Benutzereingaben, sie werden kopiert und aus einer E-Mail eingefügt, sodass sie nicht vorhanden sind, wenn die Seite geladen wird dies in Javascript zu tun, ohne, wenn möglich, einen Ajax-Aufruf an den Server.

Ich fand diese Links interessant, aber sie haben mir nicht geholfen:

ArrayBuffer in Base64-kodierte Zeichenfolge

hierbei handelt es sich um die entgegengesetzte Konvertierung von ArrayBuffer nach Base64 und nicht umgekehrt

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

das sieht gut aus, aber ich kann nicht herausfinden, wie ich den Code verwenden soll.

Gibt es eine einfache (vielleicht native) Möglichkeit, die Konvertierung durchzuführen? Vielen Dank

60
Tony

Versuche dies:

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;
}
96
Goran.it

Die Antwort von Goran.it funktioniert aufgrund von Unicode-Problemen in Javascript nicht - https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding

Am Ende habe ich die Funktion von Daniel Guerreros Blog genutzt: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/

Die Funktion ist auf github link aufgeführt: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js

Verwenden Sie diese Zeilen 

var uintArray = Base64Binary.decode(base64_string);  
var byteArray = Base64Binary.decodeArrayBuffer(base64_string); 
21
Yaan

TypedArray.from verwenden:

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

Die Leistung sollte mit der for-Loop-Version von Goran.it verglichen werden.

21
ofavre

Ich habe gerade base64-arraybuffer gefunden, ein kleines npm-Paket mit unglaublich hoher Auslastung, 5M Downloads im letzten Monat (2017-08).

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

Für jeden, der nach einer optimalen Standardlösung sucht, kann dies der Fall sein.

10
alias65536

Javascript ist eine feine Entwicklungsumgebung, daher erscheint es seltsam, dass es keine Lösung für dieses kleine Problem bietet. Die an anderer Stelle auf dieser Seite angebotenen Lösungen sind möglicherweise langsam. Hier ist meine Lösung. Es verwendet die integrierte Funktionalität, die URL-Adressen für Base64-Bild- und Tondaten dekodiert.

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();

Die Sendeanforderung schlägt fehl, wenn die Basis-65-Zeichenfolge fehlerhaft ist.

Der Mime-Typ (application/octet) ist wahrscheinlich nicht erforderlich.

In Chrom getestet. Sollte in anderen Browsern funktionieren.

4
dinosaurclover

Async Lösung, es ist besser, wenn die Daten groß sind:

// base64 to buffer
function base64ToBufferAsync(base64) {
  var dataUrl = "data:application/octet-binary;base64," + base64;

  fetch(dataUrl)
    .then(res => res.arrayBuffer())
    .then(buffer => {
      console.log("base64 to buffer: " + new Uint8Array(buffer));
    })
}

// buffer to base64
function bufferToBase64Async( buffer ) {
    var blob = new Blob([buffer], {type:'application/octet-binary'});    
    console.log("buffer to blob:" + blob)

    var fileReader = new FileReader();
    fileReader.onload = function() {
      var dataUrl = fileReader.result;
      console.log("blob to dataUrl: " + dataUrl);

      var base64 = dataUrl.substr(dataUrl.indexOf(',')+1)      
      console.log("dataUrl to base64: " + base64);
    };
    fileReader.readAsDataURL(blob);
}
0
张浩然