package main
import (
"encoding/hex"
"fmt"
)
type myLenInfo struct {
len int
index int
}
func tlv2(tlvData []byte, taps []int) []*myLenInfo {
list := make([]*myLenInfo, 0)
tapInfos := decodeTLV(tlvData)
for _, tap := range taps {
item := &myLenInfo{}
if tapInfos[tap] != nil {
item = &myLenInfo{
len: tapInfos[tap].len,
index: tapInfos[tap].index,
}
}
list = append(list, item)
}
return list
}
func decodeTLV(tlvData []byte) map[int]*myLenInfo {
resp := make(map[int]*myLenInfo)
preIndex := 0
for {
if preIndex >= len(tlvData) {
break
}
item := &myLenInfo{
len: int(tlvData[preIndex+1]),
index: preIndex + 2,
}
resp[int(tlvData[preIndex])] = item
preIndex = item.index + item.len
}
return resp
}
func main() {
var tlvStr string
fmt.Scan(&tlvStr)
var tapCount int
fmt.Scan(&tapCount)
taps := make([]int, tapCount)
for i := 0; i < tapCount; i++ {
fmt.Scan(&taps[i])
}
data, _ := hex.DecodeString(tlvStr)
results := tlv2(data, taps)
for _, info := range results {
fmt.Println(fmt.Sprintf("%d %d", info.len, info.index))
}
}
总结:先将输入的十六进制字符串转为[]byte,然后写入tap作为ke y的ma p中,查询输入的ta p是否存在,最后组合数据输出结果。