Javascript 节点无法将原始二进制数据读入浮点数组

Javascript 节点无法将原始二进制数据读入浮点数组,javascript,node.js,typed-arrays,Javascript,Node.js,Typed Arrays,我有一个单精度浮点数二进制表示的文件(如果您感兴趣,它实际上是一个FITS文件) 以下是一些示例代码和输出,以指导您: begin=2880; end=2884; console.log('HEX'); log(fileBuffer.slice(begin,end)); console.log('DEC'); log(fileBuffer.slice(begin,end.toJSON()); log(新的Float32Array(fileBuffer.buffer.slice(begin,end

我有一个单精度浮点数二进制表示的文件(如果您感兴趣,它实际上是一个FITS文件)

以下是一些示例代码和输出,以指导您:

begin=2880;
end=2884;
console.log('HEX');
log(fileBuffer.slice(begin,end));
console.log('DEC');
log(fileBuffer.slice(begin,end.toJSON());
log(新的Float32Array(fileBuffer.buffer.slice(begin,end));
输出

HEX
<Buffer 7f c0 00 00>
DEC
{ type: 'Buffer', data: [ 127, 192, 0, 0 ] }
Float32Array [ 6.905458702346266e-41 ]
有输出

start and stop: 3072 4096
Uint8Array [ 127, 192, 0, 0, 199, 80, 6, 235, 199, 83, 165, 123, 199, 101 ]
Float32Array [ 6.905458702346266e-41, -1.6237752004906055e+26 ]
您可以看到,前4个字节再次为NaN(我将此作为一个健全检查,以确保我没有减少一个字节或其他内容),接下来的4个字节是
11000111010000000001011101011
,即
-53254.918
,而不是您上面看到的
-1.62e+26

有什么好处


注意:我通过以下方式检查了我的工作:
而且

如果你看一下以下内容,你可能会注意到一些有趣的事情:

a = new Float32Array([NaN]);
b = a.buffer;
u = new Uint8Array(b);
输出为

Uint8Array(4) [0, 0, 192, 127]
换句话说,
NaN
与问题中所述的预期正好相反

这种逆转就是大端和小端的区别。第一个顺序(前面的数字较大)称为大端序,第二个顺序(末尾的数字较大)称为小端序

由于FITS数据以大端字节顺序存储,并且运行节点的计算机是小端字节,因此需要在循环中使用
DataView
getFloat32
方法(或者在字节流中,如果这是您的设置)。此方法(及其相关的
getFloat64
getInt16
等)强制执行您选择的endianness。Big-endian是默认值,因此我最终选择了如下内容:

result = new Float32Array(256);
dataView = new DataView(fileBuffer.buffer.slice(2880));
byteNum = startByte;
for (let i = 0; i < result.length; i++) {
  result[i] = dataView.getFloat32(byteNum);
  byteNum = byteNum + Float32Array.BYTES_PER_ELEMENT;
}
result=newfloat32array(256);
dataView=newdataview(fileBuffer.buffer.slice(2880));
byteNum=起始字节;
for(设i=0;i
好的,是的,我刚发现这是一个持久性问题。FITS的标准是big-endian浮动,我在一台小endian机器上。我会发布一个自我回答,解释一旦我想到如何进行字节交换,除非有人比我强:)太好了,谢谢你的自我回答!我甚至会显式地将
false
传递给
getFloat32
result = new Float32Array(256);
dataView = new DataView(fileBuffer.buffer.slice(2880));
byteNum = startByte;
for (let i = 0; i < result.length; i++) {
  result[i] = dataView.getFloat32(byteNum);
  byteNum = byteNum + Float32Array.BYTES_PER_ELEMENT;
}