Создание двоичной строки BLOB-объекта или файла из JavaScript изменяет количество байтов?

Я играл с несколькими библиотеками шифрования JS (CryptoJS, SJCL) и обнаружил проблемы, связанные с API-интерфейсами Blob / File и «двоичными строками» JavaScript.

Я понял, что шифрование даже не очень актуально, так что здесь очень упрощенный сценарий. Просто прочитайте файл, используя readAsBinaryString, а затем создайте 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...}

Я создал JSFiddle, который в основном будет выполнять все вышеперечисленное: он просто читает любой произвольный файл, создает из него большой двоичный объект и выводит длину в зависимости от размера:http://jsfiddle.net/6L82t/1/

Похоже, что при создании BLOB-объекта из «двоичной (javascript) строки» что-то с кодировкой символов в конечном итоге подменяет результат.

Если используется недвоичный файл, вы увидите, что длины BLOB-объекта и исходной двоичной строки идентичны.

Итак, что-то происходит, когда я пытаюсь создать Blob / File из нешифрованной строки Javascript, и мне нужно все, чтобы этого не произошло. Я думаю, что это может быть связано с тем, что строки JS UTF-16?

Здесь есть (возможно) связанная тема:HTML5 File API, читаемый как текстовый и двоичный

Нужно ли мне брать дешифрованные результаты (UTF-16) и «конвертировать» их в UTF-8, прежде чем поместить их в Blob / File?

Работая с кем-то в # html5 на Freenode, мы определили, что если вы читаете ArrayBuffer напрямую, а затем создаете из него большой двоичный объект, сначала используя Uint8Array, байты работают нормально. Вы можете увидеть скрипку, которая по сути делает это здесь:http://jsfiddle.net/GH7pS/4/

Проблема в том, что, по крайней мере, в моем сценарии я собираюсь получить двоичную строку и хотел бы выяснить, как напрямую преобразовать ее в BLOB-объект, чтобы я мог затем использовать загрузку html5, чтобы позволить пользователю щелкнуть, чтобы загрузить капля прямо.

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос