Ich muss eine Base64-Codierungszeichenfolge in einen ArrayBuffer konvertieren. Die base64-Zeichenfolgen sind Benutzereingaben. Sie werden aus einer E-Mail kopiert und eingefügt, sodass sie beim Laden der Seite nicht vorhanden sind. Ich möchte dies in Javascript tun, ohne wenn möglich einen Ajax-Aufruf an den Server zu senden.
Ich fand diese Links interessant, aber sie haben mir nicht geholfen:
ArrayBuffer zu Base64-codierter Zeichenfolge
Hierbei handelt es sich um die entgegengesetzte Konvertierung von ArrayBuffer zu base64, nicht umgekehrt
http://jsperf.com/json-vs-base64/2
Das sieht gut aus, aber ich kann nicht herausfinden, wie man den Code benutzt.
Gibt es eine einfache (möglicherweise native) Möglichkeit, die Konvertierung durchzuführen? Vielen Dank
bytes[i] = binary_string.charCodeAt(i);
kann also falsch seinVerwenden von TypedArray.from :
Die Leistung muss mit der for-Loop-Version der Goran.it-Antwort verglichen werden.
quelle
Uint8Array.from
mit einigen Browsern nur wenig kompatibel ist.ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>)
. (Schienen 5).buffer
Eigenschaft, was vonUint8Array
atob
oderbtoa
, Sie müssen ihnen nur gültige Eingaben geben.atob
benötigt eine gültige base64-Zeichenfolge, andernfalls wird ein Fehler ausgegeben. Undbtoa
benötigt eine gültige Byte-Zeichenfolge (auch als binäre Zeichenfolge bezeichnet), die Zeichenfolgen im Bereich von 0 bis 255 enthält. Wenn Ihre Zeichenfolge Zeichen außerhalb dieses Bereichs enthält,btoa
wird ein Fehler ausgegeben.Die Antwort von Goran.it funktioniert aufgrund eines Unicode-Problems 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 verwendet: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/
Die Funktion ist unter dem Github-Link aufgeführt: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
Verwenden Sie diese Zeilen
quelle
atob
.decodeArrayBuffer
Gibt eine zurückArrayBuffer
, deren Größe immer durch 3 teilbar ist, was ich nicht verstehe, wenn es beabsichtigt ist oder ein Fehler vorliegt. Ich werde im Github-Projekt fragen.Ich habe gerade base64-arraybuffer gefunden, ein kleines npm-Paket mit unglaublich hoher Auslastung, 5 Millionen Downloads im letzten Monat (2017-08).
https://www.npmjs.com/package/base64-arraybuffer
Für alle, die nach einer der besten Standardlösungen suchen, ist dies möglicherweise die richtige Lösung.
quelle
Asynchrone Lösung, es ist besser, wenn die Daten groß sind:
quelle
Für Node.js Benutzer:
myBuffer ist vom Typ Buffer, einer Unterklasse von Uint8Array. Leider ist Uint8Array KEIN ArrayBuffer, wie es das OP verlangt hat. Aber wenn ich einen ArrayBuffer manipuliere, verpacke ich ihn fast immer mit Uint8Array oder ähnlichem, daher sollte er nahe an dem liegen, wonach gefragt wird.
quelle
Javascript ist eine gute Entwicklungsumgebung, daher scheint es seltsam, als würde es keine Lösung für dieses kleine Problem bieten. 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 Base64-Bild- und Sounddaten-URLs dekodiert.
Die Sendeanforderung schlägt fehl, wenn die Zeichenfolge der Basis 65 schlecht gebildet ist.
Der MIME-Typ (Anwendung / Oktett) ist wahrscheinlich nicht erforderlich.
In Chrom getestet. Sollte in anderen Browsern funktionieren.
quelle
Access Denied
Fehlermeldung, die eine CORS-Einschränkung zu sein scheint.Pure JS - kein String-Mittelschritt (kein Atob)
Ich schreibe folgende Funktion, die base64 direkt konvertiert (ohne Konvertierung in einen String im mittleren Schritt). IDEE
=
, entfernen Sie eine / zwei Zahlen aus dem AusgabearrayDie folgende Lösung ermöglicht die Verarbeitung großer Base64-Eingabezeichenfolgen. Eine ähnliche Funktion zum Konvertieren von Bytes in base64 ohne btoa gibt es HIER
Code-Snippet anzeigen
quelle
quelle