Tôi đã từng chơi với một vài thư viện mã hóa JS (CryptoJS, SJCL) và phát hiện các vấn đề liên quan đến Blob/File APIs và "chuỗi nhị phân" JavaScript.Tạo Blob hoặc Tệp từ chuỗi nhị phân JavaScript thay đổi số byte?
Tôi nhận ra rằng mã hóa thậm chí không thực sự có liên quan, do đó, đây là một kịch bản được đơn giản hóa nhiều. Đơn giản chỉ cần đọc một tập tin trong việc sử dụng readAsBinaryString và sau đó tạo ra một 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...}
tôi đã tạo ra một JSFiddle rằng sẽ cơ bản làm các việc trên: nó chỉ đơn giản là đọc bất kỳ tập tin tùy ý, tạo ra một blob từ nó, và kết quả đầu ra độ dài vs size: http://jsfiddle.net/6L82t/1/
Dường như, khi tạo Blob từ chuỗi "nhị phân (javascript)", một số thứ có mã hóa ký tự kết thúc sẽ làm tăng kết quả.
Nếu không sử dụng tệp nhị phân, bạn sẽ thấy rằng độ dài của Blob và chuỗi nhị phân gốc giống nhau.
Vì vậy, có điều gì đó sẽ xảy ra khi cố gắng tạo Blob/Tệp từ chuỗi Javascript không nguyên bản và tôi cần bất kỳ điều gì không xảy ra. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với thực tế là các chuỗi JS là UTF-16?
Có một (có thể) có liên quan đến chủ đề ở đây: HTML5 File API read as text and binary
Tôi có cần để có thể lấy kết quả giải mã (UTF-16) và "chuyển đổi" họ sang UTF-8 trước khi đặt chúng trong một Blob/File ?
Làm việc với một người nào đó trong # html5 trên Freenode, chúng tôi xác định rằng nếu bạn đọc một ArrayBuffer trực tiếp và sau đó tạo blob từ đó bằng cách sử dụng một Uint8Array, các byte làm việc ra tốt. Bạn có thể thấy một câu đố về cơ bản là ở đây: http://jsfiddle.net/GH7pS/4/
Vấn đề là, ít nhất trong trường hợp của tôi, tôi sẽ kết thúc bằng chuỗi nhị phân và muốn tìm cách chuyển đổi trực tiếp thành Blob để tôi có thể sử dụng tải xuống html5 để cho phép người dùng nhấp để tải xuống blob trực tiếp.
Cảm ơn!
Bạn nhận ra rằng bài viết của bạn [đã có một lịch sử sửa đổi toàn diện] (http://stackoverflow.com/posts/23795034/revisions), phải không? Bạn có thể nhận được dấu thời gian chính xác của bất kỳ lúc nào được đăng trên trang web SE bằng cách di chuột qua nó; hãy thử điều đó với "đã hỏi 2 giờ trước" bên trên tên của bạn. –