Android NFC开发:反转NTAG 5 boost标签UID后如何实现每两字符加冒号分隔
现有实现的核心问题
- 分隔符插入逻辑错误:你手动拆分得到的
hexChars数组存储的是单个十六进制位的字符,每个Char仅代表一位0-9/A-F的数值。当前代码直接对这个单字符数组调用joinToString(":"),会在每一位单字符的间隙都插入冒号,最终输出类似E:0:0:4:...的结果,完全不符合“每两个字符(单字节)插入分隔符”的要求。 - 存在数组副作用风险:
bytes.reverse()是会直接修改传入的原字节数组的就地操作,如果这个字节数组是Android NFC框架返回的内部缓存对象,后续其他业务逻辑读取该数组时,会因为数组被提前反转出现不可预期的显示错误。
修正后的代码实现
// 提前定义十六进制字符映射,避免方法内重复创建对象 private val hexArray = "0123456789ABCDEF".toCharArray() fun byteArrayToHexInversed(bytes: ByteArray): String { // 生成反转后的新数组,不修改原传入的字节数组 val reversedBytes = bytes.reversedArray() // 以单字节为单位转换为十六进制,直接拼接冒号分隔符 return reversedBytes.joinToString(":") { byte -> val unsignedVal = byte.toInt() and 0xFF // 单字节对应两位十六进制字符,作为一个拼接单元 "${hexArray[unsignedVal ushr 4]}${hexArray[unsignedVal and 0x0F]}" } }
效果校验
用你提供的测试用例验证:
- 输入原始字节序列对应十六进制为
00 08 39 CB 58 01 04 E0 - 数组反转后得到的字节顺序:
E0 04 01 58 CB 39 08 00 - 单字节转十六进制后用冒号拼接,最终输出完全匹配预期:
E0:04:01:58:CB:39:08:00
内容的提问来源于stack exchange,提问作者Martin Denion
相关产品推荐
相关产品推荐

