刷题记录-TLV解码-100分
刷题笔记合集🔗
题目描述
TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。
码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,字节序为小端序。
现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。
输入格式
第一行: 一个字符串,表示待解码信元的Tag 第二行: 一个字符串,表示待解码的16进制码流,字节之间用空格分隔
说明:
- 输入码流的16进制字符中不包括小写字母
- 码流字符串的最大长度不超过50000个字节
输出格式
输出一个字符串,表示待解码信元以16进制表示的Value(不含小写字母)
约束说明
- Tag固定占1字节
- Length固定占2字节(小端序)
- Value长度由Length决定
- 所有16进制字符均为大写
样例输入1
31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC
样例输出1
32 33
样例说明1
从码流起始处开始匹配:
- 第一个信元:
- Tag: 32
- Length: 01 00 (小端序表示为1)
- Value: AE
- 第二个信元:
- Tag: 90
- Length: 02 00 (小端序表示为2)
- Value: 01 02
- 第三个信元:
- Tag: 30
- Length: 03 00 (小端序表示为3)
- Value: AB 32 31
- 第四个信元:
- Tag: 31 (目标Tag)
- Length: 02 00 (小端序表示为2)
- Value: 32 33 (这就是要找的值)
- 第五个信元:
- Tag: 33
- Length: 01 00 (小端序表示为1)
- Value: CC
题目解析
本题的关键点在于:
-
码流解析
- 每个信元由Tag(1字节) + Length(2字节) + Value(Length字节)组成
- 信元紧密排列,需要根据Length来定位下一个信元
-
小端序处理
- Length的两个字节需要反转再转为十进制
- 如01 00表示长度为1,而不是256
-
16进制处理
- 输入输出都是大写16进制字符
- 字节间用空格分隔
实现思路:
- 将码流按空格分割为字节数组
- 遍历处理每个信元:
- 读取Tag(1字节)
- 读取并解析Length(2字节,需反转)
- 读取Value(Length个字节)
- 找到目标Tag时返回其Value
时间复杂度: O(n),其中n是码流长度
参考代码
def solve():
# 读取输入
target = input()
stream = input().split()
# 遍历处理每个信元
i = 0
while i < len(stream):
# 读取Tag
tag = stream[i]
i += 1
# 读取Length(小端序)
length = int(stream[i+1] + stream[i], 16)
i += 2
# 读取Value
value = stream[i:i+length]
i += length
# 找到目标Tag
if tag == target:
return " ".join(va
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记