Kotlin ByteArray BCC 校验

发布时间: 2023-08-04 13:46:15 作者: 大象笔记

在 Android App 中, 要对发送给蓝牙控制板的数据增加 BCC 校验位。此处使用 Kotlin 实现。

确认校验规则

这个取决于当前项目如何约定的校验规则,不具有普遍性。可忽略。

目前的规则是:

剔除头尾字节,及倒数第二个字节的校验位,然后对此范围的数据做 BCC 校验。

测试数据

使用收到的 BLE 数据包作为测试案例。

AB 00 06 A2 05 20 32 30 2E 37 31 AB BA

即:

00 06 A2 05 20 32 30 2E 37 31

对应的 BCC 校验位为:

AB

Kotlin 扩展 ByteArray

自动给一段 ByteArray 缀上 BCC 校验位:

fun ByteArray.bcc(): ByteArray {
    var bcc = 0x00
    for (i in this) {
        bcc = bcc.xor(i.toInt())
    }

    return this.plus(bcc.toByte())
}

还是 ChatGPT 4 的代码靠谱,其他的给出的都是错误的。。。

单元测试

在 Android Studio 项目 test 目录下,加入:

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        assertEquals(4, 2 + 2)
    }

    @Test
    fun bytearray_bcc() {
        var data = byteArrayOf(0x00, 0x06, 0xA2.toByte(), 0x05, 0x20, 0x32, 0x30, 0x2E, 0x37, 0x31)
        var newData = data.bcc()

        println("data with bcc: ${newData.toHex()}")
        // data with bcc: 00 06 A2 05 20 32 30 2E 37 31 AB

        //assertEquals(newData[newData.size - 1].toInt(), 0xAB)
        // java.lang.AssertionError: expected:<-85> but was:<171>

        assertEquals(newData[newData.size - 1], 0xAB.toByte())
    }
}

右键点击此 UnitTest 文件,选择 Run UnitTest 即可执行测试,查看测试结果。

注:这里使用 toByte 的原因,参考 Kotlin ByteArray 元素大小范围

参考

我是一名山东烟台的开发者,联系作者