最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How To Convert Two 16bit Integer (High WordLow Word) into 32bit Float? - Stack Overflow

programmeradmin3浏览0评论

I have two 16bit integer raw data.

For example:
High Word = 17142 (dec) or 0100001011110110 (binary)
Low Word = 59759 (dec) or 1110100101111001 (binary)

If you treat two word together as one 32bit float data, it will be "123.456"
Binary --> 01000010111101101110100101111001

How to convert integer array [59759 , 17142] to float 123.456 in Javascript?

Note: [ X (16bit low word) , Y (16 bit high word) ] ==> Z (32bit float)

I have two 16bit integer raw data.

For example:
High Word = 17142 (dec) or 0100001011110110 (binary)
Low Word = 59759 (dec) or 1110100101111001 (binary)

If you treat two word together as one 32bit float data, it will be "123.456"
Binary --> 01000010111101101110100101111001

How to convert integer array [59759 , 17142] to float 123.456 in Javascript?

Note: [ X (16bit low word) , Y (16 bit high word) ] ==> Z (32bit float)

Share Improve this question edited Dec 5, 2016 at 9:27 Kirk Beard 9,84312 gold badges45 silver badges48 bronze badges asked Dec 5, 2016 at 9:15 Heng-Shou LiuHeng-Shou Liu 331 silver badge3 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 8

You can do this with typed arrays and ArrayBuffer, which allow you to interpret the same bits in different ways (but endianness is platform-specific). It's also possible using a DataView on the buffer, which lets you conrol endianness.

Here's the typed array approach which works with the endianness of my platform, see ments:

// 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);

Here's the DataView approach, note writing the ints in the opposite order:

// 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);

Can shorter / make more efficient @T.J. Crowder answer by using array buffer directly :

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);
发布评论

评论列表(0)

  1. 暂无评论