Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert two bytes into signed 16 bit integer in JavaScript

In JavaScript, I need to convert two bytes into a 16 bit integer, so that I can convert a stream of audio data into an array of signed PCM values.

Most answers online for converting bytes to 16 bit integers use the following, but it does not work correctly for negative numbers.

var result = (((byteA & 0xFF) << 8) | (byteB & 0xFF));
like image 454
Rick Giuly Avatar asked Jul 11 '16 02:07

Rick Giuly


1 Answers

You need to consider that the negatives are represented in 2's compliment, and that JavaScript uses 32 bit integers to perform bitwise operations. Because of this, if it's a negative value, you need to fill in the first 16 bits of the number with 1's. So, here is a solution:

var sign = byteA & (1 << 7);
var x = (((byteA & 0xFF) << 8) | (byteB & 0xFF));
if (sign) {
   result = 0xFFFF0000 | x;  // fill in most significant bits with 1's
}
like image 195
Rick Giuly Avatar answered Nov 15 '22 14:11

Rick Giuly