Float32Array
将在内部表示基于主机系统永恒性的值,通常是小端。
是的,格式是IEEE 754(这已经出现在FPU出现之前,并且它的变化处理更多的宽度,即64位,80位等)。 JavaScript中的所有数字(Number
)在内部都表示为64位IEEE 754.对于类型化数组,32位和64位IEEE 754当然可用。
PowerPC和68k CPU使用big-endian(它应该是!:)的方式)。所谓的网络顺序也是大端的,许多与平台无关的文件格式以大端字节顺序存储(尤其是音频和图形)。大多数主流电脑都使用x86这样的小端CPU。所以在这些情况下,你很可能不得不处理不同的字节顺序。
要处理这种情况,您可以不使用Float32Array,而使用DataView。
例如:
var buffer = new ArrayBuffer(10240); // some raw byte buffer
var view = new DataView(buffer); // flexible view supporting endianness
现在,你现在可以读取并牢记字节顺序写入任何位置在缓冲区(数据视图还允许读/ /写入到非对齐位置,即。如果需要,可以将Float32值写入位置3,但不能使用Float32/Uint32/Int16等)。
浏览器将在内部转换为正确的顺序 - 你只是提供价值-是:阅读时
view.setFloat32(pos, 0.5); // big-endian
view.setFloat32(pos, 0.5, false) // big-endian
view.setFloat32(pos, 0.5, true); // little-endian
而且同样:
var n = view.getFloat32(pos); // big-endian
var n = view.getFloat32(pos, false) // big-endian
var n = view.getFloat32(pos, true); // little-endian
提示:您可以使用原生Float32Array内部使用Endianess进行读取/写入。这往往是速度更快,但它需要使用数据视图在最后转换,如果得到的缓冲区的字节顺序是从主机系统不同:
var f32 = new Float32Array(buffer); // or use a size
f32[0] = 0.5;
然后确保你有大端表示:
希望给予一些投入!如果你想让我详细说明一些部分,只需向我提出问题。
来源
2015-03-31 00:02:48
K3N