Durch das Erstellen eines Blobs oder einer Datei aus einer JavaScript-Binärzeichenfolge wird die Anzahl der Bytes geändert?

Ich habe mit einigen JS-Verschlüsselungsbibliotheken (CryptoJS, SJCL) gespielt und Probleme im Zusammenhang mit den Blob / File-APIs und JavaScript- "Binärzeichenfolgen" entdeckt.

Mir ist klar geworden, dass die Verschlüsselung nicht wirklich relevant ist. Hier ist ein stark vereinfachtes Szenario. Lies einfach eine Datei mit readAsBinaryString und erstelle dann ein Blob:

>>> reader.result
"GIF89a����ÿÿÿÿÿÿ!þCreated with GIMP�,�������D�;"
>>> reader.result.length
56
>>> typeof reader.result
"string"
>>> blob = new Blob([reader.result], {type: "image/gif"})
Blob { size=64, type="image/gif", constructor=function(), more...}

Ich habe eine JSFiddle erstellt, die im Grunde genommen das oben Genannte macht: Sie liest einfach eine beliebige Datei, erstellt daraus einen Blob und gibt die Länge gegen die Größe aus:http://jsfiddle.net/6L82t/1/

Es scheint, dass beim Erstellen des Blobs aus der "binären (Javascript) Zeichenfolge" etwas mit Zeichencodierung das Ergebnis mungiert.

Wenn eine nicht-binäre Datei verwendet wird, werden Sie feststellen, dass die Längen des Blobs und der ursprünglichen Binärzeichenfolge identisch sind.

Es gibt also etwas, das passiert, wenn versucht wird, ein Blob / eine Datei aus einem Nicht-Klartext-Javascript-String zu erstellen, und ich brauche alles, was nicht passieren soll. Ich denke, es kann etwas damit zu tun haben, dass JS-Strings UTF-16 sind?

Es gibt hier einen (vielleicht) verwandten Thread:HTML5-Datei-API als Text und Binärdatei gelesen

Muss ich die entschlüsselten Ergebnisse (UTF-16) möglicherweise in UTF-8 "konvertieren", bevor ich sie in ein Blob / eine Datei lege?

In Zusammenarbeit mit jemandem in # html5 unter Freenode haben wir festgestellt, dass die Bytes einwandfrei funktionieren, wenn Sie einen ArrayBuffer direkt lesen und dann den Blob daraus erstellen, indem Sie zuerst ein Uint8Array verwenden. Sie können hier eine Geige sehen, die das im Wesentlichen macht:http://jsfiddle.net/GH7pS/4/

Das Problem ist, zumindest in meinem Szenario, dass ich am Ende eine binäre Zeichenfolge habe und herausfinden möchte, wie ich diese direkt in ein Blob konvertiere, damit ich dann den Download von html5 verwenden kann, um dem Benutzer das Klicken zum Herunterladen zu ermöglichen der blob direkt.

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage