在JavaScript中从ArrayBuffer中提取10位整数

时间:2017-05-03 17:27:01

标签: javascript ionic-framework bluetooth arraybuffer

我正在使用Ionic及其蓝牙串行插件构建蓝牙应用程序,该插件根据this方案从心率监视器读取3个字节。

[plugin]将数据作为ArrayBuffer返回,其中包含一个分布在两个字节上的10位整数。我不确定如何提取这些10位并将它们转换为整数,有人可以帮助我吗?

编辑: 这是pdf中的数据结构:

  

在实时或模拟模式下,BITalino(r)演进固件会对采集的数据进行流式处理   实时地,格式化为对应于以下的结构化位序列:

     

CRC:4位循环冗余校验(CRC)代码,用于评估数据   接收器上的数据包一致性。

     

S:固件生成的4位序列号,用于识别数据包,即可   用于接收器以检测丢包。

     

O1& O2:数字输出端口O1&的状态。设备上的O2。

     

I1& I2:数字输入端口I1&的状态。 I2在设备上。

     

A1-A6:ADC产生的数字代码,用于相应模拟输入的电压   港口A1-A6;前四个通道以10位分辨率(范围从0-1023)到达   最后两个以6位到达(范围从0到63)

图表: Bits diagram

干杯,

贾里德

2 个答案:

答案 0 :(得分:0)

如果我正确读取该图表,则数据为字节[1]的低4位与字节[0]的高6位相结合;

// (buffer[1] - 0) & 0x0f) // get the 4 bits from byte 1 // (((buffer[0] - 0) & 0xfc) << 2) // get the 6 bits from byte 0 and shift over twice result = ((buffer[1] - 0) & 0x0f) + ( ((buffer[0] - 0) & 0xfc) << 2 )

你有一个字节缓冲区看起来喜欢的样本吗?

那么,为了更好地理解0x内容,我们需要更详细地查看图表。

前4位在字节1上,特别是在0-3位。 0-3位是1 + 2 + 4 + 8 = 15或0x0f。我可以说(缓冲区[1] - 0)&amp; 15),但使用十六进制表示法0x0f看起来更干净,有点镜像数据。

对于字节0中的数据,它来自位2-7,它们加在一起等于252或0xfc。现在这个数据的问题是它从第2位开始,第1字节的数据在第3位结束。我们需要移位这些位,因此它们从第4位开始并且没有任何重叠。随着位移位,我们可以将两个数字相加并得到组合数。

如果你需要知道,我会在整个地方减去0,因为这会强制JavaScript将操作视为数字,而不是尝试执行字符串数学。

答案 1 :(得分:0)

我想你想使用read函数然后你应该做@Michael Fuller指出的事情。我会这样写(编辑):

let array = new Int8Array(3);
bluetoothSerial.read(function(data) {
    array[0] = (data >> 16) & 0xff;
    array[1] = (data >> 8) & 0xff;
    array[2] = data & 0xff;
}); 

var bits6 = parseInt(array[0] & 0xfc);
bits6 <<= 2;
//0xfc=1111 1100, 0x0f=0000 1111
var decodedInteger = bits6 + parseInt(array[1] & 0x0f);