Criar um Blob ou um arquivo a partir da string binária JavaScript altera o número de bytes?

Eu tenho jogado com algumas bibliotecas de criptografia JS (CryptoJS, SJCL) e descobri problemas relacionados às APIs de Blob / File e ao JavaScript "strings binárias".

Percebi que a criptografia não é realmente relevante, então aqui está um cenário muito simplificado. Simplesmente leia um arquivo usando readAsBinaryString e crie um 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...}

Eu criei um JSFiddle que basicamente fará o acima: ele simplesmente lê qualquer arquivo arbitrário, cria um blob a partir dele e gera o tamanho versus o tamanho:http://jsfiddle.net/6L82t/1/

Parece que, ao criar o Blob a partir da "string binária (javascript)", algo com codificação de caracteres acaba prejudicando o resultado.

Se um arquivo não binário for usado, você verá que os comprimentos do Blob e da cadeia binária original são idênticos.

Portanto, há algo que acontece ao tentar criar um Blob / File a partir de uma string Javascript sem texto sem formatação, e eu preciso do que quer que seja para que isso não aconteça. Eu acho que pode ter algo a ver com o fato de que as strings JS são UTF-16?

Há um tópico relacionado (talvez) aqui:API de arquivos HTML5 lida como texto e binário

Preciso pegar os resultados descriptografados (UTF-16) e "convertê-los" em UTF-8 antes de colocá-los em um Blob / Arquivo?

Trabalhando com alguém no # html5 no Freenode, determinamos que, se você ler um ArrayBuffer diretamente e depois criar o blob usando um Uint8Array, os bytes funcionarão perfeitamente. Você pode ver um violino que basicamente faz isso aqui:http://jsfiddle.net/GH7pS/4/

O problema é que, pelo menos no meu cenário, vou acabar com uma sequência binária e gostaria de descobrir como convertê-la diretamente em um Blob, para que eu possa usar o download do html5 para permitir que o usuário clique para fazer o download a bolha diretamente.

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion