Kotlin ByteArray BCC 校验

文章目录

    在 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 元素大小范围

    参考

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式