如何使用具有正确编码的 FileReader api 使用 javascript 获取二进制数据
How to get Binary data with javascript using FileReader api with correct encoding
我使用 FileReader api 获得了一个 mp4 数据,但我在编码时遇到了问题!
有了这个功能,
var reader = new FileReader();
var blob = new Blob([this.response], {type : "video/mp4"});
reader.onload= function (evt) {
mp4text = evt.target.result;
mp4text = mp4text.toString()
//mp4text = mp4text.slice(22);
//mp4text = CryptoJS.AES.encrypt(mp4text, "test");
//mp4text = window.atob(mp4text);
var myBlob = new Blob([evt.target.result], {type : "video/mp4"});//NOT SAME contrast to blob!
var downloadUrl = URL.createObjectURL(myBlob);
document.getElementById('myVideo').src = downloadUrl;
}
reader.readAsBinaryString(blob);
我以为 myBlob 与 blob 具有相同的文件数据,但有些数据发生了变化!更详细地说,许多字符是相同的,但一些十六进制代码不同。我该如何解决这个问题?
JavaScript中的字符串不能表示任意二进制数据,所以做readAsBinaryString可能不是你想的那样
readAsBinaryString 所做的是为每个源字节提供一个目标字符(我不知道它使用哪种字符编码)。
所以如果你有一个 utf-8 字符说 ✔,那么 readAsBinaryString 会给你 â
因为那个字符是树字节长 %E2%9C%94
.
如果您尝试将其转回 binary/blob,则字符串 â
将被视为 utf-8,它不是 3 个字节而是 7(%C3%A2%C5%93%E2%80%9D)
我的建议是使用 readAsArrayBuffer,我确定 CryptoJS 支持数组缓冲区。
我使用 FileReader api 获得了一个 mp4 数据,但我在编码时遇到了问题! 有了这个功能,
var reader = new FileReader();
var blob = new Blob([this.response], {type : "video/mp4"});
reader.onload= function (evt) {
mp4text = evt.target.result;
mp4text = mp4text.toString()
//mp4text = mp4text.slice(22);
//mp4text = CryptoJS.AES.encrypt(mp4text, "test");
//mp4text = window.atob(mp4text);
var myBlob = new Blob([evt.target.result], {type : "video/mp4"});//NOT SAME contrast to blob!
var downloadUrl = URL.createObjectURL(myBlob);
document.getElementById('myVideo').src = downloadUrl;
}
reader.readAsBinaryString(blob);
我以为 myBlob 与 blob 具有相同的文件数据,但有些数据发生了变化!更详细地说,许多字符是相同的,但一些十六进制代码不同。我该如何解决这个问题?
JavaScript中的字符串不能表示任意二进制数据,所以做readAsBinaryString可能不是你想的那样
readAsBinaryString 所做的是为每个源字节提供一个目标字符(我不知道它使用哪种字符编码)。
所以如果你有一个 utf-8 字符说 ✔,那么 readAsBinaryString 会给你 â
因为那个字符是树字节长 %E2%9C%94
.
如果您尝试将其转回 binary/blob,则字符串 â
将被视为 utf-8,它不是 3 个字节而是 7(%C3%A2%C5%93%E2%80%9D)
我的建议是使用 readAsArrayBuffer,我确定 CryptoJS 支持数组缓冲区。