Kotlin中如何将Tags数据类转为TLV?现有库不支持字符串类型
解决TLV生成时String类型Tag/Value的适配问题
你的理解没有错误,TLV核心就是Tag-Length-Value的二进制结构,只是你用的字符串(十六进制格式)是人类易读的表示形式,而TLV库要求的Int/ByteArray才是TLV字段的原生二进制类型——这不是你的理解有误,只是格式层的转换问题。
具体解决步骤
核心是把字符串类型的key和value转换成库支持的二进制类型,以下是实操方案:
1. 实现十六进制字符串转ByteArray工具方法
先写个Kotlin扩展函数处理格式转换:
fun String.hexToByteArray(): ByteArray { require(length % 2 == 0) { "十六进制字符串长度必须为偶数" } return chunked(2) .map { it.toInt(16).toByte() } .toByteArray() }
2. 转换Tag字段
你的示例Tag"df79"是十六进制字符串,转成ByteArray即可适配库要求:"df79".hexToByteArray();如果Tag是双字节以内且在Int范围,也可以直接转成Int:"df79".toInt(16)。
3. 转换Value字段
示例里的"353533"同样是二进制数据的十六进制表示,转成ByteArray:"353533".hexToByteArray();如果Value是普通文本而非十六进制,就用对应编码(比如UTF-8)转:"553".toByteArray(Charsets.UTF_8)。
4. 用KotlinTLV库生成TLV
以KotlinTLV为例,适配后的代码示例:
import com.github.devnied.kotlinnative.tlv.TlvParser import com.github.devnied.kotlinnative.tlv.model.Tlv // 定义你的Tags数据类 data class Tags(val key: String, val value: String) // 转换并生成TLV val tagEntry = Tags("df79", "353533") val tlv = Tlv( tagEntry.key.hexToByteArray(), tagEntry.value.hexToByteArray() ) val parser = TlvParser() val tlvBinaryData = parser.encode(listOf(tlv))
5. 手动实现简易TLV生成(可选)
如果库限制太多,自己写基础的BER-TLV逻辑也很简单:
fun generateBerTlv(tagHex: String, valueHex: String): ByteArray { val tagBytes = tagHex.hexToByteArray() val valueBytes = valueHex.hexToByteArray() // 处理Length字段(短格式:长度<128用单字节) val lengthBytes = if (valueBytes.size < 128) { byteArrayOf(valueBytes.size.toByte()) } else { // 长格式简化处理,按需扩展 val lenBytes = valueBytes.size.toBigInteger().toByteArray() byteArrayOf((0x80 or lenBytes.size).toByte()) + lenBytes } return tagBytes + lengthBytes + valueBytes } // 使用示例 val tlvData = generateBerTlv("df79", "353533")
补充说明
TLV库要求Int/ByteArray是因为Tag本身就是二进制标识(比如DF79属于上下文特定的私有Tag),直接操作二进制才符合ASN.1 BER-TLV的规范,字符串只是方便人类查看的转译形式。
内容的提问来源于stack exchange,提问作者Olitron
相关产品推荐
相关产品推荐

