6

类型化数组规范中,有一个构造函数允许采用现有的 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

对于这样一个简单的操作来说,代码太多了。

4

1 回答 1

8

未对齐的内存访问不适用于所有平台:

为什么创建一个 Float32Array 的偏移量不是元素大小的倍数是不允许的? http://en.wikipedia.org/wiki/Data_structure_alignment

使用 DataView 对象访问非对齐数据:

https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/DataView

于 2013-03-23T17:13:13.007 回答