我有 4 个字节的 ArrayBuffer,我使用 dataview 在索引 0 处分配了一个数字。当我尝试使用正确给出结果的数据 View 获取值但当我尝试使用类型化数组获取值时它没有给出正确的结果。任何人都可以帮忙吗?下面是代码:
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
最佳答案
那是因为您在使用 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 检查硬件的字节序。关于javascript - 为什么 Javascript TypeDArray 不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30943561/