Как конвертировать два 16-битных целых числа (старшее слово / младшее слово) в 32-битное число с плавающей запятой?
У меня есть два 16-битных целых необработанных данных.
Например:
Старшее слово = 17142 (декабрь) или 0100001011110110 (двоичный)
Младшее слово = 59759 (декабрь) или 1110100101111001 (двоичный код)
Если вы рассматриваете два слова вместе как одно 32-битное число с плавающей запятой, это будет "123.456"
Бинарный -> 01000010111101101110100101111001
Как преобразовать целочисленный массив [59759, 17142] в значение с плавающей точкой 123.456 в Javascript?
Примечание: [ X (16-разрядное старшее слово), Y (16-разрядное старшее слово) ] ==> Z (32-разрядное число с плавающей запятой)
2 ответа
Вы можете сделать это с типизированными массивами и ArrayBuffer
, которые позволяют интерпретировать одни и те же биты по-разному (но порядковый номер зависит от платформы). Также возможно использованиеDataView
в буфере, который позволяет вам управлять порядком байтов.
Вот подход с типизированным массивом, который работает с порядком байтов моей платформы, см. Комментарии:
// Create a buffer
var buf = new ArrayBuffer(4);
// Create a 16-bit int view of it
var ints = new Uint16Array(buf);
// Fill in the values
ints[0] = 59759;
ints[1] = 17142;
// Create a 32-bit float view of it
var floats = new Float32Array(buf);
// Read the bits as a float; note that by doing this, we're implicitly
// converting it from a 32-bit float into JavaScript's native 64-bit double
var num = floats[0];
// Done
console.log(num);
ВотDataView
подход, обратите внимание на запись целых в обратном порядке:
// Create a buffer
var buf = new ArrayBuffer(4);
// Create a data view of it
var view = new DataView(buf);
// Write the ints to it
view.setUint16(0, 17142);
view.setUint16(2, 59759);
// Read the bits as a float; note that by doing this, we're implicitly
// converting it from a 32-bit float into JavaScript's native 64-bit double
var num = view.getFloat32(0);
// Done
console.log(num);
Можно сократить/сделать более эффективный ответ @TJ Crowder, напрямую используя буфер массива:
var data = [59759, 17142];
// Create a buffer
var buf = new Uint16Array(data).buffer
// Create a data view of it
var view = new DataView(buf);
var num = view.getFloat32(0, true);
// Done
console.log(num);