目前,当二进制文件包含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位浮点数的二进制文件并将其转换为数组?
答案 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