【问题标题】:Why is Javascript TypeDArray not working?为什么 Javascript TypeDArray 不起作用?
【发布时间】:2015-09-05 18:09:29
【问题描述】:

我有 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 dataview typedarray


【解决方案1】:

那是因为您在使用setUint32 时使用了错误的字节序类型。具体来说,您需要它来存储 little-endian 表示,因为您的硬件就是这样运行的。

您可以使用十六进制值更轻松地看到这一点。现在,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 检查硬件的字节序。

【讨论】:

  • @apsillers 你是对的。我认为在这种情况下我必须使用 dataview.getUint32(0,true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2011-05-12
  • 2012-01-07
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多