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 を正しく解析していますか?

編集: 16 進数ビューで、バイナリ ファイルの小さな部分を追加します。

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  ................

編集 2: matlab と「fwrite」コマンドを使用して、精度「float32」でバイナリ ファイルを作成しました。http://www.mathworks.com/help/matlab/ref/fwrite.html

4

1 に答える 1

2

データのエンディアンは重要です: Javascript 型付き配列とエンディアン

エンディアンを検出して 1 バイトあたりのバイト数を抽出するか、ファイルの 2 つの異なるバージョンを作成し、エンディアンを検出して現在のブラウザーに適したものを取得する必要があります。

于 2013-06-25T18:08:44.843 に答える