为什么Javascript TypeDArray不起作用?

时间:2015-06-19 17:04:10

标签: javascript dataview typedarray

我有4个字节的ArrayBuffer,我使用dataview在索引0处分配了一个数字。当我尝试使用dataview获取值时,正确地给出了结果,但是当我尝试使用类型化数组获取值时,它没有给出正确的结果。任何人都可以帮忙吗?以下是代码:

var buffer = new ArrayBuffer(4);
var dataview = new DataView(buffer);
dataview.setUint32(0,5000);

var unint32 = new Uint32Array(buffer);

console.log(unint32[0]); //2282946560 instead of 5000
console.log(dataview.getUint32(0)); //shows correctly 5000

1 个答案:

答案 0 :(得分:5)

这是因为您在使用setUint32时使用了错误的字节序类型。具体来说,您需要它来存储小端表示,因为您的硬件行为类似。

您可以使用十六进制值更轻松地查看此内容。现在,5000 === 0x1388,而2282946560 = 0x88130000。你能看到这里的模式吗?

请改为尝试:

dataview.setUint32(0, 5000, true);

var unint32 = new Uint32Array(buffer);

console.log(unint32[0]); // 5000, yay!

正如apsillers指出的那样,如果您还要使用dataview来检索该值,那么您还必须使用dataview.getUint32(0, true)

总而言之,如果您只需要处理Uint32个数字,请忘记DataView并立即使用输入的数组:

var buffer = new ArrayBuffer(4);
var unint32 = new Uint32Array(buffer);
unint32[0] = 5000;

你永远不会弄错。

另一方面,如果您需要使用原始二进制数据填充ArrayBuffer,则需要使用this little trick检查硬件的endiannes。