我有 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/

10-11 12:50