DataView 如何设置字节顺序
How setting endianess works for DataView
我正在阅读 DataView 的 this explanation,其中有一个示例:
var littleEndian = (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
// Int16Array uses the platform's endianness.
return new Int16Array(buffer)[0] === 256;
})();
我不太明白这一行的作用:
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
是否意味着存储在[0;256]
位范围内的数据应该存储在littleEndian中?
假设我们像这样创建一个数组缓冲区和数组:
var dv = new DataView(new ArrayBuffer(4));
这意味着我们在内存中有 32 位:
0000 0000 0000 0000 0000 0000 0000 0000
现在,我们要存储数字 0x0103
,其模式为:
0000 0001 0000 0011
现在,让我们将这个数字存储在前两个字节中使用小端,在后两个字节中使用大端,看看它在内存中的布局。所以:
dv.setInt16(0, 0x0103, true);
dv.setInt16(2, 0x0103, false);
现在,DataView
中的位具有以下模式:
0000 0011 0000 0001 0000 0001 0000 0011
下面是测试该行为的代码:
var little = dv.getUint16(0);
little === 0x0103 // false
little === 0x0301 // true
var big = dv.getUint16(2);
big === 0x0103 // true
big === 0x0301 // false
我正在阅读 DataView 的 this explanation,其中有一个示例:
var littleEndian = (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
// Int16Array uses the platform's endianness.
return new Int16Array(buffer)[0] === 256;
})();
我不太明白这一行的作用:
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
是否意味着存储在[0;256]
位范围内的数据应该存储在littleEndian中?
假设我们像这样创建一个数组缓冲区和数组:
var dv = new DataView(new ArrayBuffer(4));
这意味着我们在内存中有 32 位:
0000 0000 0000 0000 0000 0000 0000 0000
现在,我们要存储数字 0x0103
,其模式为:
0000 0001 0000 0011
现在,让我们将这个数字存储在前两个字节中使用小端,在后两个字节中使用大端,看看它在内存中的布局。所以:
dv.setInt16(0, 0x0103, true);
dv.setInt16(2, 0x0103, false);
现在,DataView
中的位具有以下模式:
0000 0011 0000 0001 0000 0001 0000 0011
下面是测试该行为的代码:
var little = dv.getUint16(0);
little === 0x0103 // false
little === 0x0301 // true
var big = dv.getUint16(2);
big === 0x0103 // true
big === 0x0301 // false