【问题标题】:How do I access the indices of an ArrayBuffer created from a Blob?如何访问从 Blob 创建的 ArrayBuffer 的索引?
【发布时间】:2017-11-30 01:52:05
【问题描述】:

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

使用 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);
}

【问题讨论】:

    标签: javascript filereader arraybuffer


    【解决方案1】:

    为了能够访问 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的数据,不会克隆它的数据。

    【讨论】:

    • 感谢您的深入解释!
    【解决方案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))
    

    【讨论】:

    • 记住 readAsArrayBuffer 是异步的并且返回 void。视图必须在处理程序内部(或之后)创建。
    • 谢谢!很高兴知道答案如此简单。
    猜你喜欢
    • 2013-02-26
    • 2013-07-17
    • 2020-03-03
    • 2022-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多