在 Java 中,如何从字节数组中读取 n 位?
In Java how do you read n-bits from a byte array?
我正在尝试解析通过蓝牙从我的血压袖带接收的特定 ByteArray 的数据。根据此规范 GATT Appearance Characteristic Specification,数据是一个具有两个值的 16 位字节数组——类别(10 位)和子类别(6 位)。我不知道如何读取未存储在字节中的值。如何从字节数组中读取 16 位中的 10 位和 16 位中的 6 位?那么一旦我有了 10 位,我是否必须用 6 个零填充它才能得到一个值?我假设这些不是标志,当然可能是字符串值。
我一直在尝试了解有关按位运算的各种 tutorials and guides,但它就是不了解如何读取 10 位。
deviceConnection =
device.establishConnection(true)
.flatMapSingle {
for (g in gattCharacteristics) {
singles.add(it.readCharacteristic(g.uuid))
}
Single.zip(
singles
) { varargs ->
val values: MutableList<ByteArray> = mutableListOf()
for (v in varargs) {
values.add(v as ByteArray)
}
return@zip values
}
}
.observeOn(AndroidSchedulers.mainThread())
.take(1)
.subscribe(
{
characteristics.forEachIndexed { index, c ->
c.value = processByteArray(c.uuid, it[index])
}
serviceDetailsAdapter.notifyDataSetChanged()
},
{
onConnectionFailure(it)
}
)
然后在 processByteArray
函数中我需要弄清楚如何解析数据。
由于金额未对齐到 8 位字节,为了使事情更简单,首先将两个字节放在一起:
byte mostSignifant = byteArray[0];
byte leastSignifant =byteArray[1];
int bothBytes = (Byte.toUnsignedInt(mostSignifant) << 8) | Byte.toUnsignedInt(leastSignifant);
您的文档应该告诉您两个字节中哪个是 "most significant byte" (MSB),哪个是最小字节 (LSB) - 可能是索引 0 具有最低有效字节。
现在您可以提取您想要的位,例如
int lower6Bits = bothBytes & 0b111111;
int higher10Bits = bothBytes >>> 6; // get rid of lower 6 bits
我正在尝试解析通过蓝牙从我的血压袖带接收的特定 ByteArray 的数据。根据此规范 GATT Appearance Characteristic Specification,数据是一个具有两个值的 16 位字节数组——类别(10 位)和子类别(6 位)。我不知道如何读取未存储在字节中的值。如何从字节数组中读取 16 位中的 10 位和 16 位中的 6 位?那么一旦我有了 10 位,我是否必须用 6 个零填充它才能得到一个值?我假设这些不是标志,当然可能是字符串值。
我一直在尝试了解有关按位运算的各种 tutorials and guides,但它就是不了解如何读取 10 位。
deviceConnection =
device.establishConnection(true)
.flatMapSingle {
for (g in gattCharacteristics) {
singles.add(it.readCharacteristic(g.uuid))
}
Single.zip(
singles
) { varargs ->
val values: MutableList<ByteArray> = mutableListOf()
for (v in varargs) {
values.add(v as ByteArray)
}
return@zip values
}
}
.observeOn(AndroidSchedulers.mainThread())
.take(1)
.subscribe(
{
characteristics.forEachIndexed { index, c ->
c.value = processByteArray(c.uuid, it[index])
}
serviceDetailsAdapter.notifyDataSetChanged()
},
{
onConnectionFailure(it)
}
)
然后在 processByteArray
函数中我需要弄清楚如何解析数据。
由于金额未对齐到 8 位字节,为了使事情更简单,首先将两个字节放在一起:
byte mostSignifant = byteArray[0];
byte leastSignifant =byteArray[1];
int bothBytes = (Byte.toUnsignedInt(mostSignifant) << 8) | Byte.toUnsignedInt(leastSignifant);
您的文档应该告诉您两个字节中哪个是 "most significant byte" (MSB),哪个是最小字节 (LSB) - 可能是索引 0 具有最低有效字节。
现在您可以提取您想要的位,例如
int lower6Bits = bothBytes & 0b111111;
int higher10Bits = bothBytes >>> 6; // get rid of lower 6 bits