【问题标题】:Is Uint8Array / Uint16Array conversion broken in Firefox OS simulator?Firefox OS 模拟器中的 Uint8Array / Uint16Array 转换是否中断?
【发布时间】:2013-08-28 01:33:14
【问题描述】:

如果我只是愚蠢的话,我会为她感到高兴。 :)

这是我的代码:

var t16 = new Uint16Array( new Uint8Array([1, 2, 3, 4]));
console.log(t16.BYTES_PER_ELEMENT);
for( var i = 0; i < t16.length; i++) 
    console.log(t16[i]);

这是我得到的输出:

[02:56:32.197] 2
[02:56:32.197] 1
[02:56:32.197] 2
[02:56:32.197] 3
[02:56:32.197] 4

从我期望的文档中:

2
513
1027

在实际项目中,我使用了一个 tar 库,它提供了一个 ArrayBuffer,其中包含我想读取的 16 位数据,但我总是只能访问 8 位值。

我的期望错了吗?至少我是这样阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays中的“使用复杂数据结构”一节的

记录:Firefox 是 23.0.1,Java 是 Platform SE 7 U25 10.25.2.17,Firefox OS 模拟器是 W7/64 机器上的 5.0pre3。

【问题讨论】:

  • 请注意,在 little-endian 机器上,您只会得到 513 和 1027(在修复传递 .buffer 之后)。在大端机器上,你会得到 258 和 772。

标签: javascript firefox firefox-os


【解决方案1】:
var t8 = new Uint8Array([1, 2, 3, 4]),
    t16 = new Uint16Array(t8);

这样Uint16Array constructor 会将t8 视为普通数组(就像Uint8Array 处理数组字面量一样)并将构造一个新数组(缓冲区),将元素复制到该数组中。

要在同一个ArrayBuffer 上创建ArrayBufferView,您需要将该缓冲区传递给构造函数:

var t8=new Uint8Array([1, 2, 3, 4]),
    t16 = new Uint16Array( t8.buffer );
//                           ^^^^^^^
console.log(t16.byteLength/t16.length); // or: t16.constructor.BYTES_PER_ELEMENT
for (var i = 0; i < t16.length; i++)
    console.log(t16[i]);

【讨论】:

  • 太棒了!就是这样。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多