在类型化数组规范中,有一个构造函数允许采用现有的 ArrayBuffer 并将其视为另一种数组类型。有趣的是,offset 参数必须是构造数组的基础类型的倍数。这种限制的原因是什么?
对于背景 - 我正在尝试对要通过 WebSocket 发送的二进制缓冲区进行编码。缓冲区包含不同大小的各种变量。最初我想使用以下代码:
var buffer = new ArrayBuffer(10);
new Uint32Array(buffer, 0, 1)[0] = 234;
new Int16Array(buffer, 4, 1)[0] = -23;
new Uint32Array(buffer, 6, 1)[0] = 6000; // Exception is raised here,
// because 6 is not multiple of 4
为了完成这项工作,我需要将最后一行重写如下:
var tempArray = new Uint32Array(1); // Create 32-bit array
tempArray[0] = 6000; // Write 32-bit number
var u8Src = new Uint8Array(tempArray, 0); // Create 8-bit view of the array
var u8Dest = new Uint8Array(buffer, 6, 4); // Create 8-bit view of the buffer
u8Dest.set(u8Src); // Copy bytes one by one
对于这样一个简单的操作来说,代码太多了。