我正在测试 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
时,setUint32
和 getUint32
函数有一个额外的参数 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
你好我是一名正在学习的初级程序员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
时,setUint32
和 getUint32
函数有一个额外的参数 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