我有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
答案 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。