#P3102. TLV解码(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 184
            Accepted: 48
            Difficulty: 5
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>模拟          
 
TLV解码(100分)
题目首先会给定一个tag,然后给你一个字符串,对于每一段码流,第一个字符串表示当前的tag,第二个字符串和第三个字符串的十六进制组合表示长度lenth,接下来lenth个字符串表示value,我们要找到当前的tag等于题目给定的tag时长度为lenth个value直接输出即可
模拟一遍过程即可
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main()
{
	ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    string tag;
    cin>>tag;
    vector<string>s;
    string temp;
    while(cin>>temp)
    {
        s.push_back(temp);
    }
    while(s.size())
    {
        string ntag=s[0];//取出现在的tag
        s.erase(s.begin());
        string len1=s[0];
        s.erase(s.begin());
        string len2=s[0];
        s.erase(s.begin());
        int len=stoi(len2+len1,nullptr,16);//求lenth
        vector<string>f;
        for(int i=0;i<len;i++)
        {
            f.push_back(s[0]);
            s.erase(s.begin());
        }
        if(ntag==tag)
        {
            for(auto x:f)cout<<x<<" ";
            return 0;
        }
    }
}
python
def main():
    import sys
    input = sys.stdin.read
    data = input().splitlines()  # 读取所有输入并按行分割
    
    tag = data[0]  # 读取第一行作为目标标签
    s = []
    
    # 读取剩余行并分割成字符串列表
    for line in data[1:]:
        s.extend(line.split())
    while s:  # 当列表不为空时
        ntag = s.pop(0)  # 取出当前标签
        len1 = s.pop(0)  # 第一部分长度
        len2 = s.pop(0)  # 第二部分长度
        
        # 将长度从十六进制转换为十进制
        length = int(len2 + len1, 16)
        
        f = []  # 存储接下来字符串的列表
        for _ in range(length):
            f.append(s.pop(0))  # 收集接下来的 'length' 个字符串
        
        if ntag == tag:  # 如果当前标签与目标标签匹配
            print(" ".join(f))  # 输出结果
            return
if __name__ == "__main__":
    main()
java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        String tag = scanner.nextLine();  // 读取目标标签
        List<String> s = new ArrayList<>();  // 用于存储输入字符串
        
        // 读取剩余的输入并将其分割成字符串
        while (scanner.hasNext()) {
            s.add(scanner.next());
        }
        
        while (!s.isEmpty()) {  // 当列表不为空时
            String ntag = s.remove(0);  // 取出当前标签
            String len1 = s.remove(0);   // 第一部分长度
            String len2 = s.remove(0);   // 第二部分长度
            
            // 将长度从十六进制转换为十进制
            int length = Integer.parseInt(len2 + len1, 16);
            
            List<String> f = new ArrayList<>();  // 存储接下来的字符串
            for (int i = 0; i < length; i++) {
                f.add(s.remove(0));  // 收集接下来的 'length' 个字符串
            }
            
            if (ntag.equals(tag)) {  // 如果当前标签与目标标签匹配
                System.out.println(String.join(" ", f));  // 输出结果
                return;
            }
        }
        
        scanner.close();  // 关闭扫描器
    }
}
        题目内容
TLV编码是按[TagLengthValue]格式进行编码的,,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。
码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节, 字节序为小端序。
现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。
输入码流的16进制字符中,不包括小写字母,且要求输出的16进制字符串中也不要包含小写字母;码流字符串的最大长度不超过50000个字节。
输入描述
输入的第一行为一个字符串,表示待解码信元的Tag;
输入的第二行为一个字符串,表示待解码的16进制码流,字节之间用空格分隔。
输出描述
输出一个字符串,表示待解码信元以16进制表示的Value。
样例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
输出
32 33
说明
需要解析的信元的Tag是31,
从码流的起始处开始匹配,
第一个信元的Tag是32,信元长度为1(01 00,小端序表示为1);
第二个信元的Tag是90,其长度为2;
第三个信元的Tag是30,其长度为3;
第四个信元的Tag是31,其长度为2(02 00)
所以返回长度后面的两个字节即可,即32 33。