readAsBinaryString() 无法正常工作
readAsBinaryString() not working properly
这是我的代码:
var reader = new FileReader();
reader.onload = function(e) {
download(reader.result, "Test.stl");
}
reader.readAsBinaryString(input_file_field.files[0]);
结果文件:
原文件:
输出几乎相同,差异很小(这不是 "download" 函数的问题,如果我在控制台中输入日志也是一样的)。
知道发生了什么事吗?
编辑:
这是我用于二进制转换的代码(两者都不起作用):
var reader = new FileReader();
reader.onload = function(e) {
var fileData = reader.result;
var bytes = new Uint8Array(fileData);
var binaryText = '';
for (var index = 0; index < bytes.byteLength; index++) {
binaryText += String.fromCharCode(bytes[index]);
}
download(binaryText, "Test.stl");
}
reader.readAsArrayBuffer(input_field.files[0]);
将文件作为 ArrayBuffer 读取后,内容将采用二进制格式(作为原始字节数组)。
这一行:
binaryText += String.fromCharCode(bytes[index]);
然而, 可能会把事情搞砸,因为 ASCII 范围 (0-127) 之外的任何值都受制于 16 位 unicode 编码 (UTF-16/USC-2),并且原始字节最终可能会使用两个字符来表示源值。
例如,您可以看到第一个差异出现在位置 0x55 的位置,字节值 0xB3(十进制为 179)并且在 ASCII 范围之外,变为 0xC2B3。下一个值 0xEF(十进制为 239)变为 0xC3AF,然后保留下一个 0x3E,因为它小于 128,依此类推。
但是,没有充分的理由执行此转换步骤,因为数据已经是二进制格式。可以(并且应该)删除整个循环。
只需将视图分配给 ArrayBuffer(就像在转换步骤之前所做的那样)并使用它通过 index/position.
读取数据
如果您打算解析格式,我建议您使用 DataView 而不是 Uint8Array,因为文件倾向于定义可变宽度的数据字段,而 DataView 在这些情况下更加灵活和方便。
如果它是为了传输到 server/store 以供下载,您只需保留原始文件 blob 并按原样发送(参见第一个 test fiddle)。
这是我的代码:
var reader = new FileReader();
reader.onload = function(e) {
download(reader.result, "Test.stl");
}
reader.readAsBinaryString(input_file_field.files[0]);
结果文件:
原文件:
输出几乎相同,差异很小(这不是 "download" 函数的问题,如果我在控制台中输入日志也是一样的)。
知道发生了什么事吗?
编辑:
这是我用于二进制转换的代码(两者都不起作用):
var reader = new FileReader();
reader.onload = function(e) {
var fileData = reader.result;
var bytes = new Uint8Array(fileData);
var binaryText = '';
for (var index = 0; index < bytes.byteLength; index++) {
binaryText += String.fromCharCode(bytes[index]);
}
download(binaryText, "Test.stl");
}
reader.readAsArrayBuffer(input_field.files[0]);
将文件作为 ArrayBuffer 读取后,内容将采用二进制格式(作为原始字节数组)。
这一行:
binaryText += String.fromCharCode(bytes[index]);
然而,可能会把事情搞砸,因为 ASCII 范围 (0-127) 之外的任何值都受制于 16 位 unicode 编码 (UTF-16/USC-2),并且原始字节最终可能会使用两个字符来表示源值。
例如,您可以看到第一个差异出现在位置 0x55 的位置,字节值 0xB3(十进制为 179)并且在 ASCII 范围之外,变为 0xC2B3。下一个值 0xEF(十进制为 239)变为 0xC3AF,然后保留下一个 0x3E,因为它小于 128,依此类推。
但是,没有充分的理由执行此转换步骤,因为数据已经是二进制格式。可以(并且应该)删除整个循环。
只需将视图分配给 ArrayBuffer(就像在转换步骤之前所做的那样)并使用它通过 index/position.
读取数据如果您打算解析格式,我建议您使用 DataView 而不是 Uint8Array,因为文件倾向于定义可变宽度的数据字段,而 DataView 在这些情况下更加灵活和方便。
如果它是为了传输到 server/store 以供下载,您只需保留原始文件 blob 并按原样发送(参见第一个 test fiddle)。