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)。