在JS中读/写浮点字节

Mic*_*kin 21 javascript math floating-point serialization ieee-754

有什么办法可以在JS中读取浮点值的字节吗?我需要的是将原始FLOAT或DOUBLE值写入我需要制作的二进制格式,那么有没有办法获得逐字节的IEEE 754表示?当然,同样的写作问题.

Eri*_*ric 38

您可以使用类型化数组执行此操作:

var buffer = new ArrayBuffer(4);
var intView = new Int32Array(buffer);
var floatView = new Float32Array(buffer);

floatView[0] = Math.PI
console.log(intView[0].toString(2)); //bits of the 32 bit float
Run Code Online (Sandbox Code Playgroud)

或者另一种方式:

var view = new DataView(new ArrayBuffer(4));
view.setFloat32(0, Math.PI);
console.log(view.getInt32(0).toString(2)); //bits of the 32 bit float
Run Code Online (Sandbox Code Playgroud)

不知道浏览器支持是什么样的

  • 酷,TIL`Double`在Javascript中称为`Float64`.我一直在寻找`DoubleArray` - 无济于事 - 但是`Float64Array`存在并且看起来对我有用 (4认同)
  • 请注意,IE9不支持此功能! (2认同)
  • 看起来您可以使用`Uint8Array`(至少在Chrome中)而不是`Int32Array`来更轻松地获取单个字节 (2认同)
  • @bryc,Netscape Navigator 支持也不完美。 (2认同)

Har*_*ikk 8

我已经创建了Milos解决方案的扩展,它应该更快一些,假设TypedArrays当然不是一个选项(在我的情况下,我正在使用它们不可用的环境):

function Bytes2Float32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128) 
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);
}
Run Code Online (Sandbox Code Playgroud)

给定一个包含4个字节的整数,保存IEEE-754 32位单精度浮点数,这将产生(粗略)正确的Javascript数值而不使用任何循环.


Koo*_*Inc 2

这个片段有帮助吗?

var parser = new BinaryParser
  ,forty = parser.encodeFloat(40.0,2,8) 
  ,twenty = parser.encodeFloat(20.0,2,8);  
console.log(parser.decodeFloat(forty,2,8).toFixed(1));   //=> 40.0
console.log(parser.decodeFloat(twenty,2,8).toFixed(1));  //=> 20.0
Run Code Online (Sandbox Code Playgroud)

  • 该片段中使用的算法已被彻底破坏。当用于读取浮点数或双精度数时,它会在特定值上失败。例如,40.0 读作 32.0,20.0 读作 16.0。 (6认同)
  • 不要使用这个 BinaryParser 类!它*不*严格兼容(它使用“with”)! (6认同)
  • 拥有 BinaryParser 会让您依赖于该片段。 (2认同)