【发布时间】:2018-12-29 08:20:38
【问题描述】:
我看到的关于 ArrayBuffer 的唯一真实教程来自 HTML5Rocks。但我特别想知道如何操作各个字节。例如,Mozilla ArrayBuffers 上的这个cartoon 显示了包裹在 Uint8Array 视图中的 ArrayBuffer 的图像:
它给人的感觉是你可以用一个 ArrayBuffer 来做到这一点:
var x = new ArrayBuffer(10)
x[0] = 1
x[1] = 0
...
x[9] = 1
即手动设置字节。但是我还没有看到任何关于这种功能的文档。相反,您似乎应该使用其中一个 TypedArray 组件或 DataView:
var x = new ArrayBuffer(100)
var y = new DataView(x)
y.setUint32(0, 1)
console.log(y.getUint32(0)) // 1
console.log(x[0]) // undefined
但在使用 DataView 操作 ArrayBuffer 之后,您似乎无法直接访问 ArrayBuffer 上的任何字节。
尝试用 ArrayBuffer 和 DataView 做其他事情我很困惑:
var x = new ArrayBuffer(100)
var y = new DataView(x)
y.setUint32(0, 1)
y.setUint32(1, 2)
console.log(y.getUint32(0)) // 0 (incorrect)
console.log(y.getUint32(1)) // 2 (correct)
var x = new ArrayBuffer(100)
var y = new DataView(x)
y.setUint32(0, 1)
y.setUint32(2, 2)
console.log(y.getUint32(0)) // 0 (incorrect)
console.log(y.getUint32(1)) // 0 (?)
console.log(y.getUint32(2)) // 2 (correct)
var x = new ArrayBuffer(100)
var y = new DataView(x)
y.setUint32(0, 1)
y.setUint32(3, 2)
console.log(y.getUint32(0)) // 0 (incorrect)
console.log(y.getUint32(1)) // 0 (?)
console.log(y.getUint32(2)) // 0 (?)
console.log(y.getUint32(3)) // 2 (correct)
直到最后我得到与 32 字节视图对齐的 4 个字节。但接下来就更奇怪了:
var x = new ArrayBuffer(100)
var y = new DataView(x)
y.setUint32(0, 1)
y.setUint32(4, 2)
console.log(y.getUint32(0)) // 1
console.log(y.getUint32(1)) // 256
console.log(y.getUint32(2)) // 65536
console.log(y.getUint32(3)) // 16777216
console.log(y.getUint32(4)) // 2
这告诉我需要手动将 32 位值放在适当的位置,但我不明白为什么其他值会像 256 和 65536 这样出现。
接下来,我希望能够将字节打印为 101011100100 等、整个 ArrayBuffer 或只是其中的一部分。
最后,我希望能够对 8、16 和 32 位以外的值进行编码,例如 base64、4 位或奇数位。没有通用的 DataView API 可以做到这一点,例如通用的 y.setUint(bitsCount, offset, value),不知道为什么。
总而言之,在处理低级位管理时,我有很多不熟悉的地方。但是,我想学习如何使用它。因此,如果有人能够快速展示如何获得 ArrayBuffer + DataView 组合的实用知识,那将非常有帮助。
我了解如何使用 Uint8Array 和相关的 TypedArrays,我只是想学习如何使用较低级别的 ArrayBuffer。
【问题讨论】:
-
好吧,on the MDN site 它声明“您不能直接操作 ArrayBuffer 的内容”。所以这就是为什么你不能做
x[0] = 1之类的事情它还提到当你新建一个ArrayBuffer时,它的所有条目都初始化为0。这就是为什么例如console.log(y.getUint32(1)) // 0 (?)你的问题的其余部分很好,但是你'为一个问题提出了很多问题,使这个问题过于广泛......
标签: javascript bit-manipulation arraybuffer typed-arrays