Ich brauche eine effiziente (native lesen) Methode, um eine ArrayBuffer
in eine base64-Zeichenfolge zu konvertieren , die für einen mehrteiligen Beitrag verwendet werden muss.
javascript
encoding
base64
arraybuffer
zaheer
quelle
quelle
join()
Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Das funktioniert gut für mich:
In ES6 ist die Syntax etwas einfacher:
Wie in den Kommentaren erwähnt, kann diese Methode in einigen Browsern zu einem Laufzeitfehler führen, wenn der
ArrayBuffer
groß ist. Die genaue Größenbeschränkung ist in jedem Fall implementierungsabhängig.quelle
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
ist sicher für Zeichen im Codebereich 0-255, da dies hier der Fall ist (Denken Sie an die 8 ZollUint8Array
).Für diejenigen, die es kurz mögen, ist hier eine andere,
Array.reduce
die keinen Stapelüberlauf verursacht:quelle
<amount of Bytes in the buffer>
neue Zeichenfolgen.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Es gibt eine andere asynchrone Möglichkeit, Blob und FileReader zu verwenden.
Ich habe die Leistung nicht getestet. Aber es ist eine andere Denkweise.
quelle
dataurl.split(',', 2)[1]
anstelle vondataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
könnte theoretisch ein Prozent der codierten Daten zurückgegeben werdenURUR (und es scheint, dass dies in jsdom tatsächlich der Fall ist )split
besser alssubstring
?Ich habe das benutzt und arbeite für mich.
quelle
Meine Empfehlung hierfür ist, KEINE nativen
btoa
Strategien zu verwenden, da diese nicht alleArrayBuffer
…Schreiben Sie die DOMs atob () und btoa () neu.
Obwohl ich diesen genauen Fehler noch nie festgestellt habe, habe ich festgestellt, dass viele der von
ArrayBuffer
mir versuchten Codierungen falsch codiert wurden.Ich würde entweder die MDN-Empfehlung oder das Wesentliche verwenden.
quelle
btoa
funktioniert nicht mit String, aber OP fragtArrayBuffer
.quelle
Im Folgenden finden Sie zwei einfache Funktionen zum Konvertieren von Uint8Array in Base64 String und wieder zurück
quelle
function
Schlüsselwort hinzu und es sollte in einem modernen Browser funktionieren.Sie können ein normales Array aus dem ableiten,
ArrayBuffer
indem Sie verwendenArray.prototype.slice
. Verwenden Sie eine FunktionArray.prototype.map
, um Bytes in Zeichen umzuwandeln undjoin
diese zusammen in eine Zeichenfolge umzuwandeln .Diese Methode ist schneller, da keine Zeichenfolgenverkettungen ausgeführt werden.
quelle
Das OP hat die laufende Umgebung nicht angegeben, aber wenn Sie Node.JS verwenden, gibt es eine sehr einfache Möglichkeit, dies zu tun.
In Übereinstimmung mit den offiziellen Node.JS-Dokumenten https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Wenn Sie beispielsweise unter Angular ausgeführt werden, wird die Pufferklasse auch in einer Browserumgebung verfügbar gemacht.
quelle
Javascript
. Deshalb habe ich meine Antwort aktualisiert, um sie präziser zu gestalten. Ich denke, dies ist eine wichtige Antwort, da ich nach einer Möglichkeit gesucht habe und nicht die beste Antwort auf das Problem finden konnte.An meiner Seite musste ich mit Chrome Navigator DataView () verwenden, um einen ArrayBuffer zu lesen
quelle
Dies ist besser, wenn Sie JSZip zum Entpacken des Archivs aus einer Zeichenfolge verwenden
quelle