为什么JavaScript的TypeDArray无法工作?

4

我有一个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

Javascript Typed Arrays and Endianness密切相关(或重复)的内容。 - apsillers
1个回答

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,你可能想使用 这个小技巧 检查硬件的字节序。


@apsillers 您是正确的。我认为在这种情况下,我必须使用 dataview.getUint32(0,true)。 - Opencartmart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接