在 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 聊聊, 查看更多联系方式