【问题标题】:Read binary file containing 32 Bit floating points in JavaScript在 JavaScript 中读取包含 32 位浮点的二进制文件
【发布时间】:2016-02-29 23:13:13
【问题描述】:

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

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 });
  });
});

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

我认为这是可行的,因为 Float32Array 视图需要读取标准 JavaScript Numbers,其大小为 64 位。

一旦二进制文件包含 32 位数字,我只会从中得到垃圾(NaNs 和错误的数字)。

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

【问题讨论】:

  • “我认为这是可行的,因为 Float32Array 视图需要读取标准的 JavaScript 数字,它们的大小为 64 位。”。不,TypedArrays 不是那样工作的。如果我的答案不起作用,请提供示例数据。它是如何产生的?也许字节顺序是错误的。
  • 您的答案看起来不错,但我无法从文件中得到任何有意义的信息。这是一个示例:dl.dropboxusercontent.com/u/8538734/doubles.bin
  • 您确定 .bin 文件是 32 位浮点数吗?你期待什么样的数字?比如哪个范围?请参阅我的更新答案。

标签: javascript node.js


【解决方案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

【讨论】:

  • 您的答案有效!但是你能提供一个你可以从偏移量中读取的地方吗?和 fs.read 一样吗?
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2011-09-11
  • 2011-09-25
  • 2015-11-11
  • 2010-09-13
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多