2013-06-25 2 views
3

Я пытаюсь прочитать двоичный файл значений с плавающей запятой в массив в JavaScript. В настоящее время я делаю это путем:Как правильно читать двоичные данные с плавающей запятой, используя XMLHttpRequest?

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?

EDIT: Добавление небольшой части бинарного файла, ввиду шестигранной:

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

+0

Если вы 'console.log (mFloatArray)' вы получаете нужные значения? Из любопытства, как выглядит 'binary_float_data.bin'? –

+0

Значения в console.log (mFloatArray) неверны, на самом деле они все огромные величины, как положительные, так и отрицательные. Кроме того, в данных нет NaN. binary_float_data.bin в этом случае - это скорости от гидромониторинга, данные должны больше походить на «0,0065 0,0071 0,0002 0,0002 0,0001» – spiffman

+0

Действительно ли это бинарный файл или просто текстовый файл? Может быть, JavaScript читает, читает коды ASCII символов, а не «двоичные» данные? –

ответ

2

Порядок байтов ваших данных важно: Javascript Typed Arrays and Endianness

Вы должны были бы обнаружить и извлечь порядка байтов число байт в байт, или создать две различные версии файла, обнаружения и извлечения порядка байтов правильный один для текущий браузер.

+0

Я ответил выше, но оба значения по умолчанию для функции fwrite для Matlab и значение по умолчанию для getFloat32 немного ограничены, и я добавили необязательные аргументы, чтобы убедиться в этом. Что касается документов matlab, каждый элемент представляет собой 32-битное число с плавающей запятой в маленьком конце. Еще не повезло ... – spiffman

+0

Упс! сегодня день противоположный. По умолчанию для getFloat32 является Big endian, я изменил его с помощью getFloat32 (..., true), и данные выглядят лучше, но все же не правильно ... – spiffman

+0

Принимается, потому что это определенно проблема, но данные все еще не являются точно правильно – spiffman