为什么创建一个Float32Array,其偏移量不是不允许的元素大小的倍数?

Mar*_*kus 12 javascript typed-arrays

我想读取一个二进制文件,在字节偏移31处有几个32位浮点值.

不幸的是,new Float32Array(buffer, 31, 6);不起作用.偏移量为32而不是31,但我需要31.

根据此页面,偏移量必须是元素大小的倍数,在这种情况下为4.

我对这种行为背后的原因感兴趣.为什么视图开始的位置很重要?

到目前为止我找到最好的解决方法还没有成为壁虎,所以我不能使用它.

我是否真的必须将字节值剪切并复制到新数组中以获取浮点值?

Kel*_*yne 9

我对这种行为背后的原因感兴趣.为什么视图开始的位置很重要?

某些体系结构不允许未对齐的字访问,并且在允许诸如x86之类的体系结构上存在性能损失(尽管某些指令必须对齐).

我是否真的必须将字节值剪切并复制到新数组中以获取浮点值?

是的,就像Markus的例子一样,你应该创建一个ArrayBuffer带有UInt8Array视图和Float32Array视图的新视图read_buffer(带有UInt8Array视图的副本和视图中的解释Float32Array).然后,您可以使用a将数据UInt8Array复制到read_buffer视图中,然后使用Float32Array.这是一个非常无缝的过程.


nkr*_*ron 5

DataView.getFloat32()将是最好的方法。DataView专为打包数据而设计,并允许以非对齐方式访问ArrayBuffer中的数据,因此您可以传递像31这样的奇数偏移量。