如何使用XMLHttpRequest正确读取二进制浮点数据?

3

我在尝试将一个二进制浮点数文件读入JavaScript数组中。目前我是这样做的:

var mRequest = new XMLHttpRequest();
mRequest.open('GET', 'res/binary_float_data.bin');
mRequest.responseType = 'arraybuffer';

mRequest.onreadystatechange = function () {
    if (mRequest.readyState === 4) {

        // Get bytes
        var buffer = mRequest.response;
        var dataview = new DataView(buffer);

        // Create buffer (4 bytes / float)
        var mFloatArray = new Float32Array(buffer.byteLength / 4);

        // Copy floats
        for (var i = 0; i < mFloatArray.length; i++) 
        {
            mFloatArray[i] = dataview.getFloat32(i * 4); // At every 4th byte
        }

        console.log("Loaded "+mFloatArray.length+" floats");

        // Do something with mFloatArray
    }
};

mRequest.send();

然而,当我查看结果数组(mFloatArray)的最小值、最大值和平均值时,它们并不正确。它们应该是:

min: -0.0094
max: 0.0081
avg: 1.3196e-04

我得到的是:

相反,我正在获取:

min: -3.3985008792505584e+38
max: 0
avg: NaN

我确定二进制文件正确,那么我是否正确解析XMLHttpRequest? 编辑: 添加二进制文件的小部分内容,以十六进制视图呈现:
0002980: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0002990: 0000 0000 0000 0000 0000 0000 55df 11bc  ............U...
00029a0: afc5 13bc c0b2 15bc 4205 17bc a094 17bc  ........B.......
00029b0: e3d4 17bc cb41 18bc f2e6 18bc 464d 19bc  .....A......FM..
00029c0: bb94 18bc f6ca 16bc 29a5 14bc 0000 0000  ........).......
00029d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

EDIT 2: 我使用Matlab和“fwrite”命令制作了二进制文件,精度为'float32'。 http://www.mathworks.com/help/matlab/ref/fwrite.html


如果你使用 console.log(mFloatArray),你能得到想要的值吗?出于好奇,binary_float_data.bin 是什么样子的? - gen_Eric
console.log(mFloatArray)中的值不正确,实际上它们都是巨大的数量级,既有正数又有负数。此外,数据中没有NaN。在这种情况下,binary_float_data.bin是来自水力模拟的速度,数据应该看起来更像“0.0065 0.0071 0.0002 0.0002 0.0001”。 - Alfredo Gimenez
这实际上是一个二进制文件还是一个文本文件?也许JavaScript正在读取字符的ASCII代码,而不是"二进制"数据? - gen_Eric
1
我添加了二进制文件的十六进制视图。我使用matlab中的fwrite(vars,'float32')进行了制作,这是一种直接的二进制输出。他们是否可能使用不同的浮点格式/表示法? - Alfredo Gimenez
1
我觉得这似乎与字节序有关。此外,文件开头的那些零很可疑,如果我没记错的话,没有浮点数会转换成零字节。 - Ast Derek
1个回答

2

数据的字节序很重要:JavaScript Typed Arrays and Endianness

您需要检测字节序并逐个提取数字,或创建两个不同版本的文件,检测字节序并检索当前浏览器的正确版本。


我之前已经回答过了,Matlab的fwrite函数和getFloat32函数的默认值都是小端字节序,我添加了可选参数以确保它。就Matlab文档而言,每个元素都是一个小端字节序的32位浮点数。但仍然没有成功... - Alfredo Gimenez
糟糕!今天是反向日。getFloat32的默认值为大端序,我使用getFloat32(...,true)将其更改,数据看起来更好了,但仍然不正确... - Alfredo Gimenez
已接受,因为那肯定是一个问题,但数据仍然不完全正确。 - Alfredo Gimenez
你能发布这些新数字吗?尝试生成一个具有明确定义模式的数字文件并进行比较。 - Ast Derek
上一个问题是在处理数值时出现了一个愚蠢的错误,一旦修复了这个问题,一切看起来都很好!感谢您的帮助! - Alfredo Gimenez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接