在JavaScript中读取包含32位浮点的二进制文件

时间:2016-02-29 12:11:08

标签: javascript node.js

目前,当二进制文件包含64位浮点数时,我会这样做:

x

(二进制文件是一个简单的数字列表。它们没有任何分隔)

我认为这是有效的,因为Float32Array视图需要读取标准的JavaScript fs.open('doubles.bin', 'r', (err, fd) => { if (err) reject(err); const buf = new Buffer(size); fs.read(fd, buf, 0, size, start, (err2) => { if (err2) reject(err2); const f32 = new Float32Array(buf.buffer); const data = Array.prototype.slice.call(f32); resolve({ id, data }); }); }); ,其大小为64位。

一旦二进制包含32位数字,我只会得到垃圾(Number s和错误的数字)。

如何使用JavaScript读取包含32位浮点数的二进制文件并将其转换为数组?

1 个答案:

答案 0 :(得分:1)

使用DataView类的getFloat32方法。根据数据的存储方式,您还需要littleEndian标志。

Node的Buffer和TypedArrays之间有slight incompatibilities。唯一安全的方法是手动将每个字节从Buffer复制到ArrayBuffer。或者在您的情况下,根本不使用TypedArrays并使用节点方法。

以大端方式输出第二个和第三个双精度(64位)(我们跳过8个字节并从文件中读取下一个16个字节)。

var fs = require('fs');

var position = 8;
var length = 16;

fs.open('./doubles.bin', 'r', function(err, fd) {
    if(err) {
        return console.error(err);
    }

    var buffer = new Buffer(length);

    fs.read(fd, buffer, 0, length, position, function(err, bytesRead) {
        if(err) {
            return console.error(err);
        }

        console.log(buffer.readDoubleBE(0));
        console.log(buffer.readDoubleBE(8));
    });
});
0.37290650606155396
0.4405119717121124