如何在Kotlin中创建混合类型ByteArray用于BLE特征写入?
嘿,我完全懂你这种困扰——Swift里那种把各种类型直接塞进Data的便捷写法确实爽,但Kotlin里得手动处理字节拼接,不过其实也没那么复杂,我给你几个实用的方案,适配你要的混合类型ByteArray需求:
方案1:用ByteArrayOutputStream手动拼接(最直观,适合新手)
这个方法就像把不同的字节片段挨个拼起来,非常好理解,完美匹配你的场景:
import java.io.ByteArrayOutputStream fun buildBlePayload(): ByteArray { val stream = ByteArrayOutputStream() // 依次写入单个字节的数值:0、1、0x02、1 stream.write(0) stream.write(1) stream.write(0x02) stream.write(1) // 写入字符串(注意用UTF-8编码,必须和设备端保持一致) stream.write("me@emailaddr.com".toByteArray(Charsets.UTF_8)) return stream.toByteArray() }
方案2:结合你的BlePayload数据类封装复用
既然你已经定义了BlePayload,可以给它加个扩展函数,直接把数据类转成ByteArray,后续复用起来更方便:
data class BlePayload(val protoVer: Int, val transId: Int, val cmdType: Int, val valueType: Int, val value: String) // 给BlePayload添加转BLE可用ByteArray的方法 fun BlePayload.toBleByteArray(): ByteArray { val stream = ByteArrayOutputStream() // 这里假设你的这几个Int都是单字节范围(0-255),直接写入即可 stream.write(protoVer) stream.write(transId) stream.write(cmdType) stream.write(valueType) // 写入字符串 stream.write(value.toByteArray(Charsets.UTF_8)) return stream.toByteArray() } // 使用示例 val myPayload = BlePayload(0, 1, 0x02, 1, "me@emailaddr.com") val bleWriteData = myPayload.toBleByteArray()
进阶:处理多字节整数(如果后续有需要)
如果你的protoVer这类字段是超过单字节的数值(比如16位的传输ID),就用ByteBuffer来处理字节顺序(BLE通常用小端字节序,记得和设备端提前约定好):
import java.nio.ByteBuffer import java.nio.ByteOrder fun BlePayload.toMultiByteByteArray(): ByteArray { // 计算总长度:4个Int各占2字节 + 字符串字节数 val totalLength = 4 * 2 + value.toByteArray(Charsets.UTF_8).size val buffer = ByteBuffer.allocate(totalLength) .order(ByteOrder.LITTLE_ENDIAN) // 小端字节序,按需调整 // 写入16位整数 buffer.putShort(protoVer.toShort()) buffer.putShort(transId.toShort()) buffer.putShort(cmdType.toShort()) buffer.putShort(valueType.toShort()) // 写入字符串 buffer.put(value.toByteArray(Charsets.UTF_8)) return buffer.array() }
几个关键注意点
- 字符串编码一定要和BLE设备端统一,优先用UTF-8避免乱码;
- 如果生成的ByteArray长度超过BLE特征的MTU值,可能需要分块传输(这个是另一个话题,有需要可以再细说);
- 字节顺序(大端/小端)必须和设备端约定一致,不然解析出来的数值会完全错误。
内容的提问来源于stack exchange,提问作者addzo
相关产品推荐
相关产品推荐

