我正在测试 ArrayBuffer 并想知道为什么结果看起来像这样:

I am testing ArrayBuffer and wonder why the result looks like this:

你好我是一名正在学习的初级程序员JavaScript。当我查看源代码时,我创建了一个带有 DataView(缓冲区)的视图,并使用 setUint32 将值放入位置 0。为什么当我使用 Uint32Array 再次加载缓冲区时,值 536870912 没有更改为 32?

var buffer = new ArrayBuffer(76);
var view = new DataView(buffer);

var value = 20000000;

// set value 536807912
view.setUint32(0, parseInt(value, 16));

// [17/05/2019 10:00:20.149] [LOG]    getUint32 536870912
console.log('getUint32 ' + view.getUint32(0));

var test = new Uint32Array(buffer);

/* [17/05/2019 10:00:20.150] [LOG]    Uint32Array [ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] */
console.log(test);

你看到 32 使用 Uint32Array 的原因是 Endianness。当使用 DataView 时,setUint32getUint32 函数有一个额外的参数 littleEndian,当省略时它默认为 big-endian。然后,使用 Uint32Array,它将使用您系统的字节顺序,在本例中为 little-endian.

所以在 Uint32Array 的情况下,您使用 big-endian 设置值,然后使用 little-endian 检索它,得到值 32。

为了说明这一点,下面是使用不同字节顺序的两个值:

536870912 =
Little-endian:  00 00 00 20
Big-endian: 20 00 00 00

32 =
Little-endian:  20 00 00 00
Big-endian: 00 00 00 20