如何访问从Blob创建的ArrayBuffer的索引?

时间:2017-11-30 01:52:06

标签: javascript filereader arraybuffer

我不认为自己是程序员,所以我通过搜索这个网站找到了很多很多问题的答案。不过,我一直无法想出这个。

使用Javascript(真的是我现在甚至可以尝试的唯一语言),我正在尝试上传文件并将其二进制数据加载到ArrayBuffer中进行编辑。我正在利用FileSaver.js和Blob.js来提高兼容性。我让用户选择文件,然后加载文件。加载开始时,FileReader使用readAsArrayBuffer将文件加载到ArrayBuffer中。我目前已将其设置为发出警告以检查ArrayBuffer的内容,但我最终将删除它并简单地处理数据。

如果我取出索引,警告知道它正在显示一个ArrayBuffer,但每当我选择一个索引(如[0])时,它就会告诉我它未定义。如何将文件数据导入ArrayBuffer?它将如何分割?我最好喜欢索引1个字节。

function loadButtonPressed() {
    var loadedFile = document.getElementById('loadFile').files;
    var testFile = loadedFile[0];
    var reader = new FileReader();
    reader.onloadend = function(evt) {
        if (evt.target.readyState == FileReader.DONE) {
            alert(String(reader.result[0]));
        }
    };
    reader.readAsArrayBuffer(testFile);
}

2 个答案:

答案 0 :(得分:2)

缓冲区只是一系列没有意义的字节。 JS没有提供直接操作缓冲区的方法。要查看缓冲区,您需要一个视图,它定义缓冲区的解释方式 - 类型化数组或DataView对象。试试这个:

// ...
let buffer = reader.result;
let view = Int8Array(buffer);
console.log(view[0]);

或者这个:

// ...
let buffer = reader.result;
console.log(new DataView(buffer).getInt8(0))

答案 1 :(得分:2)

为了能够访问ArrayBuffer的数据,您需要从中创建一个视图。

这可以通过两种方式完成:

TypedArrays
这些是类似于数组的对象,ArrayBuffer的每个字节都将以所选的TypedArray类型表示。请注意,这将使用系统的字节顺序。



var buf = new TextEncoder().encode('Hello world').buffer;
console.log(buf);
// create an Uint8 view
var view = new Uint8Array(buf);
console.log(view);
// now you can iterate and modify your arrayBuffer from this view.
view[0] = 23;

console.log(new Uint8Array(buf)[0]);




DataView
这个速度较慢,但​​可以获得更多选项来获取和设置ArrayBuffer中的数据。例如,您可以设置字节序,不需要检查缓冲区的byteLength以获取Int32值等。



var buf = new TextEncoder().encode('Hello world').buffer;
console.log(buf);
// create a dataView
var view = new DataView(buf);
console.log(view.getUint8(0));
// now you can iterate and modify your arrayBuffer from this view.
view.setUint8(0, 23);

console.log(new Uint8Array(buf)[0]);




注意:两种方法都会直接修改ArrayBuffer的数据,并且不会克隆其数据。