在Java中,你如何从一个字节数组中读取n-bit?

问题描述 投票:0回答:1

我试图从一个特定的ByteArray中解析数据,我通过蓝牙从我的血压袖带接收数据。根据这个规范 关贸总协定外观特征规格 数据是一个16位的字节数组,有两个值--类别(10位)和子类别(6位)。我不知道如何读取没有存储在字节中的值。如何从一个字节数组中读取16位中的10位和16位中的6位?那么一旦我有了10-bit,我是否必须用6个0来填充它以获得一个值?我假设这些不是标志当然是潜在的字符串值。

我一直在试图理解各种 教程指南 上的Bitwise操作,但就是不知道如何读取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 函数,我需要弄清楚如何解析数据。

java arrays byte bit
1个回答
1
投票

由于金额没有对齐到8位字节,为了让事情变得更简单,先把两个字节放在一起。

byte mostSignifant = byteArray[0];
byte leastSignifant =byteArray[1];
int bothBytes = (Byte.toUnsignedInt(mostSignifant) << 8) | Byte.toUnsignedInt(leastSignifant);

你的文档应该告诉你这两个字节中哪个是 "最重要的字节"(MSB),哪个是最小的(LSB)--可能是索引0的字节最不重要。

现在你可以提取你想要的位,例如

int lower6Bits = bothBytes & 0b111111;
int higher10Bits = bothBytes >>> 6; // get rid of lower 6 bits
© www.soinside.com 2019 - 2024. All rights reserved.