从 JavaScript 中的 ArrayBuffer 中提取一个 10 位整数

Extract a 10-bit integer from an ArrayBuffer in JavaScript

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

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

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

While in live or simulated mode, the BITalino (r)evolution firmware streams the acquired data in real time, formatted as a structured sequence of bits corresponding to:

CRC: 4-bit Cyclic Redundancy Check (CRC) code, useful for the evaluation of the data packet consistency on the receiver.

S: 4-bit sequential number generated by the firmware to identify the packet, which can be used on the receiver to detect packet loss.

O1 & O2: State of the digital output ports O1 & O2 on the device.

I1 & I2: State of the digital input ports I1 & I2 on the device.

A1-A6: Digital code produced by the ADC for the voltage at the corresponding analog input ports A1-A6; the first four channels arrive with 10-bit resolution (ranging from 0-1023) while the last two arrive with 6-bit (ranging from 0-63)

以及图表: Bits diagram

干杯,

贾里德

如果我没看错图表,数据是 byte[1] 的低 4 位与 byte[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。我本可以说 (buffer[1] - 0) & 15),但使用十六进制表示法 0x0f 看起来更干净并且有点反映数据。

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

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

我猜您想使用 read 函数,然后您应该按照@Michael Fuller 指出的进行操作。我会这样写 (Edit):

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