Float32Array 将在内部表示基于主机系统字节序的值,通常是小字节序。
是的,格式是 IEEE 754(这在 FPU 出现之前就已经存在,它的变体处理更多的宽度,即 64 位、80 位等等)。 JavaScript 中的所有数字 (Number) 在内部都表示为 64 位 IEEE 754。对于类型化数组,当然可以使用 32 位和 64 位 IEEE 754。
PowerPC 和 68k CPU 使用大端序(它应该是这样的!:))。所谓网络顺序也是big-endian,很多平台无关的文件格式都是用big-endian字节顺序存储的(尤其是音频和图形)。大多数主流计算机使用 little-endian CPU,例如 x86。因此,在结合使用这些的情况下,您很可能必须处理不同的字节顺序。
要处理字节顺序,您可以使用 DataView 来代替 Float32Array。
例如:
var buffer = new ArrayBuffer(10240); // some raw byte buffer
var view = new DataView(buffer); // flexible view supporting endianness
现在您可以在考虑字节序的情况下读取和写入缓冲区中的任何位置(DataView 还允许读取/写入非对齐位置,即,如果需要,您可以将 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,然后使用字节序对其进行读/写。这往往会更快,但如果结果缓冲区的字节序与主机系统不同,则需要在最后使用 DataView 进行转换:
var f32 = new Float32Array(buffer); // or use a size
f32[0] = 0.5;
然后确保你有大端表示:
var view = new DataView(f32.buffer);
var msbVal = view.getFloat32(0): // returns 32-bit repres. in big-endian
希望提供一些意见!如果您希望我详细说明某些部分,请向我提出问题。