2016-11-23 2 views
0

Мне нужно распаковать двоичный файл, где некоторые значения являются полуточными поплавками (т. Е. float16).Как преобразовать значение «uint16» в float с половинной точностью (т. Е. «Float16»)?

Я прочитал его из бинарного потока, используя спецификацию API dataView.getUint16(0).

Как преобразовать число в формате uint16back to float16` формат с помощью JavaScript?

+0

читать [это] (https://en.wikipedia.org/wiki/Half- precision_floating-point_format) - посмотрите, можете ли вы это выяснить –

+0

, у javascript нет «float16», поэтому вы никогда не будете преобразовывать его в фактический float16 - вы можете преобразовать его в «Number» или event float32 или float64 (Number) - если то, что вы хотите сделать, читается «float16», манипулирует значением и сохраняет/записывает/отправляет «float16» - вам нужно сначала преобразовать двоичные данные, которые у вас есть в uint16, в число , манипулировать им, а затем преобразовать обратно в uint16 –

ответ

1

Все числовые переменные в Javascript рассматриваются как 64-битные поплавки (удваиваются).

После того, как вы прочитали его из DataView в переменную, он будет в этой форме.

В set* методы на объекте DataView позволяют установить байты в ArrayBuffer с использованием различных упаковочных форм:

dv.setUint16(0, 12); 
dv.getUint16(0); // >>> 12 

Но вы должны быть осторожны зажима сами:

dv.setUint16(0, -12); 
dv.getUint16(0); // >>> 65524 

Для подписанное int16:

dv.setInt16(0, -12); 
dv.getInt16(0); // >>> -12 
+0

Если вы читаете «float16» как uint16, вы не получите float64 по магии. 1 в поплавке 16 является двоичным '0 01111 0000000000' - который будет считаться как' 15,360' при чтении как uint16 –

+0

Я просто имел в виду, что когда он считывается в переменную, резервное хранилище становится float64, нет необходимости преобразовывать его в сделайте его подписанным. –

+0

Да, проблема в том, чтобы преобразовать его –